2ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Excel VBA 質問スレ Part22

1 :デフォルトの名無しさん:2011/11/27(日) 22:36:18.78
01 http://pc11.2ch.net/test/read.cgi/tech/1054356121/
02 http://pc11.2ch.net/test/read.cgi/tech/1168308855/
03 http://pc11.2ch.net/test/read.cgi/tech/1180192018/
04 http://pc11.2ch.net/test/read.cgi/tech/1189814602/
05 http://pc11.2ch.net/test/read.cgi/tech/1197448064/
06 http://pc11.2ch.net/test/read.cgi/tech/1205231499/
07 http://pc11.2ch.net/test/read.cgi/tech/1212587819/
08 http://pc11.2ch.net/test/read.cgi/tech/1219673793/
09 http://pc11.2ch.net/test/read.cgi/tech/1228372971/
10 http://pc12.2ch.net/test/read.cgi/tech/1235332603/
11 http://pc12.2ch.net/test/read.cgi/tech/1241885130/
12 http://pc12.2ch.net/test/read.cgi/tech/1247566074/
13 http://pc12.2ch.net/test/read.cgi/tech/1254281104/
14 http://pc12.2ch.net/test/read.cgi/tech/1262748898/
15 http://pc12.2ch.net/test/read.cgi/tech/1271261239/
16 http://hibari.2ch.net/test/read.cgi/tech/1280045912/
17 http://hibari.2ch.net/test/read.cgi/tech/1289182437/
18 http://hibari.2ch.net/test/read.cgi/tech/1298240666/
19 http://hibari.2ch.net/test/read.cgi/tech/1305754555/
20 http://hibari.2ch.net/test/read.cgi/tech/1312435844/

前スレ:
Excel VBA 質問スレ Part21
http://hibari.2ch.net/test/read.cgi/tech/1316931607/

2 :デフォルトの名無しさん:2011/11/27(日) 22:37:24.79
ExcelのVBAに関する質問スレです

★1 質問テンプレ(雛形)は用意しませんが、OSとExcelのバージョンは必ず書きましょう。

★2 ExcelのVBA以外の部分に関する質問はNGです。
   但し、VBA無しでも出来ることだが、あえてVBAでやりたいって物に関してはOK。

★3 ExcelのVBE(Visual Basic Editor)を使うとしても、VBAの分野以外に関してはスレ違いです。

 VBAとは、『Visual Basic for Application』の略で
  Application
  ├Workbooks
  |└Workbook
  |  ├Worksheets
  |  |└Worksheet
 というApplication以下のオブジェクトを、VB言語で操作するものを指します。
 例えExcel付属のVBE(Visual Basic Editor)を利用しようとも、このApplication以下のブックやシート、
 セルやオブジェクト等を操作するもの以外はVBA分野の話ではないので、ここでは聞かないでください。

★4 とりあえず、Excelのインスタンスを作らずにVB6で出来ることは全てスレ違いだと思ってください。

★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ。

★6 わからなければとりあえず「マクロの記録」(Alt, T, M, R)


3 :前スレ980:2011/11/27(日) 22:40:56.31
初めてスレたてた。
URLとかテンプレとか間違ってたらごめん。
あと、話を遮って質問したけども、関係ない話はやめたほうがいい。
だって、俺がスレたてなきゃいけなくなtt(ry

4 :デフォルトの名無しさん:2011/11/27(日) 23:19:04.69
>>1

5 :デフォルトの名無しさん:2011/11/27(日) 23:22:10.17
>>1
前スレの最後はうんこくんが荒らして大変だったねw
ILの直腸注入だったっけ


6 :デフォルトの名無しさん:2011/11/27(日) 23:27:38.33
まだ、粘着してるよ。

スルー推奨 >> 各位

7 :デフォルトの名無しさん:2011/11/27(日) 23:28:32.99
愛の直腸注入に付いては俺も聞きたいが
また荒れるからやめとけ

8 :デフォルトの名無しさん:2011/11/27(日) 23:55:43.05
名前って値が増えても自動で拡張できないけどこれVBA使えばできるよね
やり方教えてくれ

  A
1 100
2 200
3 300

ここで、A1〜A3に「表1」という名前をつける
つぎにA4に、400という数値を入力すると
A1〜A3の範囲だった「名前:表1」が自動的に「A4」まで拡張される

みたいなことやりたいんだけどどうやればいい?

9 :デフォルトの名無しさん:2011/11/28(月) 00:20:00.95
セルの入力イベントで
名前の範囲をカレントリージョンのものに付け直せば?

10 :デフォルトの名無しさん:2011/11/28(月) 00:31:53.27
>>8
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Set r = ActiveWorkbook.Names("表1").RefersToRange
If r.Column = Target.Column And r.Row + r.Rows.Count = Target.Row Then
ActiveWorkbook.Names("表1").RefersTo = "=" & Target.Worksheet.Name & "!" & r.Resize(r.Rows.Count + 1).Address
End If
End Sub

とりあえず適当に書いてみた
下に一つ増えるだけ。複数貼り付けとかどうなるかしらん
Worksheet_Changeイベントで、てきとうに範囲決めて、Names().RefersToで設定するだけ
すきな用に直してくれ

11 :デフォルトの名無しさん:2011/11/28(月) 04:51:18.01
前スレで以下の質問をしたものなのですが

> 変数 X に例えばA1〜A20の数値の和、合計を入れたいのですが。
という質問をして

> X = WorksheetFunction.Sum(Worksheets("Sheet1").Range("A1:A20"))
というアドバイスをいただいたのですが、この一文を経過したあとで、

ファンクションプロシージャで定義された語句を使うとエラーか、上手く作動しなく
なってしまうのですが、なにかそのようなルールがあるのでしょうか?

12 :デフォルトの名無しさん:2011/11/28(月) 07:25:32.21
質問です。
Offset(,1)とOffset(0,1)ではどちらが一般的でしょうか?

13 :デフォルトの名無しさん:2011/11/28(月) 07:30:48.54
>>11
うーん。
状況が見えないから何とも言えないけど、
@何か別に理由がある。
A合計対象セル範囲に足せない文字列とかが含まれている。
B合計対象セル範囲がシート枠を超えている。
CILとの直交性
あたりが原因なんじゃないかな。


14 :デフォルトの名無しさん:2011/11/28(月) 07:39:44.44
>>12
そこを省略しちゃうと、Offset知らない人に
NullやVbNullString辺りが入ることが許されるのか、
勝手に0が入るのかコードから見て取れないから、
前者は余り一般的とは呼べないと思う。
一般的、可読性が高いのは後者じゃない?

15 :デフォルトの名無しさん:2011/11/28(月) 11:15:08.97
>>12
俺は0は書かないな。
こんな簡単なものに可読性もへったくれもないと思うし。
ところで省略を嫌う人ってResizeで
With Range("A1").Currentregion
  .Resize( ,2)
End With
これを下のように略さずに書くのかな?
With Range("A1").Currentregion
  .Resize(.Rows.Count ,2)
End With

16 :デフォルトの名無しさん:2011/11/28(月) 11:30:47.07
>>8
Excelのバージョンは?
2007以降ならテーブル(構造化参照)使えばいいんじゃないの?

17 :デフォルトの名無しさん:2011/11/28(月) 12:16:00.19
「仕事に役立つ ExcelVBA実用サンプルコレクション」の本は大人気。
amazonの中古で売れに売れて、もう高額の出品者からしか買えなくなりました。
すでにレアものです。


18 :デフォルトの名無しさん:2011/11/28(月) 13:15:28.02
>>12,14,15
一般的って意味が、どう書く人が多いかって話なら
Offset(,1)やResize( ,2) って書く人が多いと思う
可読性に関して言えば、省略しない方が高いのはたしかではあるが
どっちにしろOffsetやResizeが何をするか、引数は何かが解らないと使えないので
大差がないと言えばまあその通り
だがたとえばこの例だと、Offsetは省略した値は0だけど、Resizeは省略した値はゼロではない
俺ならOffsetは0であることを明示的に示しときたいので省略しない
Resizeは変更しないことを明示的に示しときたいので、あえて書かない

19 :デフォルトの名無しさん:2011/11/28(月) 17:53:47.27
>>17
新装版あるけど

20 :17:2011/11/28(月) 19:39:03.82
>>19
新装版のことを言っておるにょだ

21 :デフォルトの名無しさん:2011/11/28(月) 21:54:24.65
Dim s(0) as String
s(0) = "aaa"
Debug.Print s(0)
これがなぜ通るのか理解できません。

22 :デフォルトの名無しさん:2011/11/28(月) 22:08:26.22
>>21
どこがどう問題だと思うの?

23 :デフォルトの名無しさん:2011/11/28(月) 22:15:17.18
>>22
どこがどう問題と思ってると思う?

24 :デフォルトの名無しさん:2011/11/28(月) 23:29:09.18
>>23
C言語に置き換えたらなんとなくわかるんじゃないか?

25 :デフォルトの名無しさん:2011/11/28(月) 23:32:05.60
C言語の配列は個数を指定する
VBAの配列はインデックスの最大値を書く

Dim s(1)だとs(0)とs(1)の2個になる

26 :デフォルトの名無しさん:2011/11/28(月) 23:32:32.36
>>17

つい、今確認したけど、普通に、Amazonで定価で買えるよ。
Amazonでは、常に人気書籍を定価以上の価格で出品している業者が張り付いている。

普段は売れないけど、たまたまAmazonの在庫が切れたときにアクセスして、、
「まずい、もうレアものになってしまったんだ」って勘違いして買う人が居るからだって。

27 :デフォルトの名無しさん:2011/11/29(火) 00:42:34.48
>>26
そうでしたか。
それはすばらしいです。

ところでVBAじゃなくExcelの関数のほうも
こういうサンプルがた〜くさん載ってる実用的な本は
ないものでしょうか?

28 :デフォルトの名無しさん:2011/11/29(火) 07:58:26.67
>>25
ありがと、やっぱそうなのか。ググっても"要素数を指定"って書いてるのが多くて悩んだ。
久しぶりにVBA触ると色々謎仕様に直面して驚く。

29 :デフォルトの名無しさん:2011/11/29(火) 17:54:00.68
一つのボタンで、画像と曲を変えていくものを作りたいです。
画像の部分はできたけれども、曲がだめぽ。
Dim cnt As Integer
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringA" (ByVal lpstrCommand As String, ByVal lpstrReturnString As String, ByVal uReturnLength As Long, ByVal hwndCallback As Long) As Long
Private Const FILE_NAME As String = "C:\menu.mp3"
Private Sub UserForm_Initialize()
cnt = 1
ImageChange
musicChange
End Sub
Private Sub CommandButton1_Click()
ImageChange
musicChange
End Sub
Private Sub ImageChange()
On Error Resume Next
With Worksheets(1)
If cnt > .OLEObjects.Count Then cnt = 1
Image1.Picture = .OLEObjects("Image" & cnt).Object.Picture
cnt = cnt + 1
End With
End Sub
Private Sub musicChange()
If cnt = 1 Then
Call mciSendString("play """ & FILE_NAME & """", "", 0, 0)
Else
Call mciSendString("close """ & FILE_NAME & """", "", 0, 0)
End If
End Sub
曲はここから入れ子にしたいのだけど、最初の曲が流れない・・・

30 :デフォルトの名無しさん:2011/11/29(火) 19:15:51.93
cntが初期値1でImageChangeで+1されてからmusicChangeを呼び出してる
つまりcnt=1でmusicChangeを呼び出すことはないわけだが


31 :デフォルトの名無しさん:2011/11/29(火) 21:31:14.11
Private Sub musicChange()
If cnt = 2 Then
Call mciSendString("play """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\アンパンマン.mp3" & """", "", 0, 0)
End If
If cnt = 3 Then
Call mciSendString("play """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
Else
Call mciSendString("close """ & "C:\カレーパンマン.mp3" & """", "", 0, 0)
End If
・・・以下 cnt=7 まで
End Sub

>>30 ありがとー。ちゃんと見直したらうっかりだった。
   で、このif文。うーん、確実にmp3をクリックで消すのでこの処理だけど
   もっとスマートにならんかのー。

32 :デフォルトの名無しさん:2011/11/29(火) 21:39:18.52
ファイル名を配列に突っ込んでおけばいいじゃない。
んで、ループで回してcntに一致している奴だけplayで後は全部close。

33 :デフォルトの名無しさん:2011/11/29(火) 21:42:18.96
初心者です。
実行時エラー1004が出ます。
どこを直せばいいのか教えてください。
windows7/excel2010

Sub SetRows()
With Worksheets("Sheet2")
.Activate
.Range(Cells(2, 2), Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub

34 :デフォルトの名無しさん:2011/11/29(火) 21:45:14.47
Cellsの出所が怪しいな。

35 :デフォルトの名無しさん:2011/11/29(火) 22:53:27.13
>>33
標準モジュールに書いてれば糞コードだけど一応それで動くはず。
Sheet2以外のシートモジュールに書いてあればRangeとCellsの親(シート)が違うので動かない。
正しくは
Sub SetRows()
With Worksheets("Sheet2")
  .Range(.Cells(2, 2), .Cells(5, 5)).EntireRow.Value = "hoge"
End With
End Sub
とCellsにもシートの修飾をつける。

36 :デフォルトの名無しさん:2011/11/29(火) 23:39:35.49
>>35
なるほど、なるほど
ありがとうございます!!

Sheet2以外のシートモジュールに書いてます。

インターネットのサイトを見て勉強し始めた段階なので
糞コードなのは申し訳ないです。

勉強になりました!

37 :デフォルトの名無しさん:2011/11/30(水) 22:44:11.50
VBAの入力補完機能だっけ?(Ctrl+Spaceのヤツ)

自分で定義したConstなどなどが
入力補完されることに今更気がついた。

しかも標準モジュールにつけた名前なんかも
入力補完の対象なのね。

処理時間は落ちるかもしれないけど、
標準モジュール名.モジュール名〜などで
明確に定義付けすると意味が通ってメンテが楽になりそう。


38 :デフォルトの名無しさん:2011/12/01(木) 10:32:45.43
VBAからデスクトップ上などになるtxtファイルの中身を操作(文字列の追加・書き換え・削除)することは可能ですか?

39 :デフォルトの名無しさん:2011/12/01(木) 13:45:12.97
可能

40 :38:2011/12/01(木) 15:48:27.73
どうするのかを聞いておるのだ、アホ

41 :デフォルトの名無しさん:2011/12/01(木) 15:53:42.14
>>40
VBAでそういうコードを書けば良い
OK?

42 :デフォルトの名無しさん:2011/12/01(木) 16:48:51.03
>>38 は可能かどうかを聞いてるだけだが? アホ?


43 :デフォルトの名無しさん:2011/12/01(木) 22:06:18.25
ここはあえてOPENステートメントを推してみる。
How meny files? な世界も偶には良いよね。

44 :デフォルトの名無しさん:2011/12/01(木) 22:28:00.06
Windows Script Host Object Modelへ参照設定して
Dim DesktopPath As String
Dim ShellObject As IWshRuntimeLibrary.WshShell

Set ShellObject = New IWshRuntimeLibrary.WshShell
DesktopPath = ShellObject.SpecialFolders("Desktop")

これでデスクトップのパスは得られるから、後は好きなようにやればよろし


45 :デフォルトの名無しさん:2011/12/02(金) 00:53:27.34
FileSystemObject使ってファイルパスとってきてそれを開いてあなた色に染めてから閉じる


46 :デフォルトの名無しさん:2011/12/02(金) 12:00:59.07
テキストファイルに色を付ける方法kwsk

47 :デフォルトの名無しさん:2011/12/03(土) 11:02:53.92
そういうのスレ違いって>>2に書いてあるよ

48 :46:2011/12/03(土) 11:15:11.77
そんなこと言わずに教えれ

49 :デフォルトの名無しさん:2011/12/03(土) 15:46:49.14
>>48
これお勧めだよ。

http://ec2.images-amazon.com/images/I/413NNoUiCoL._SL500_AA300_.jpg

50 :デフォルトの名無しさん:2011/12/04(日) 00:43:59.63
 ̄ ̄ ̄ ̄ ̄ ̄ ̄l/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
     ∧_∧
    ( ´・ω・`)     ∧_∧
    /     \   (    )何言ってんだこいつ
.__| |    .| |_ /      ヽ
||\  ̄ ̄ ̄ ̄   / .|   | |
||\..∧_∧    (⌒\|__./ ./
||.  (    )     ~\_____ノ|   ∧_∧
  /   ヽ 空気読めよ   \|   (    )
  |     ヽ           \/     ヽ. オマエ馬鹿だろ
  |    |ヽ、二⌒)        / .|   | |
  .|    ヽ \∧_∧    (⌒\|__./ /


51 :デフォルトの名無しさん:2011/12/04(日) 03:36:25.49
VBAで日付のシリアルの変数はIntegerで保管しておいて良い?
あるいはLongにしないとだめ?
あらまDate型もあるのね。絶対にDateにしないとだめ?

52 :デフォルトの名無しさん:2011/12/04(日) 08:00:58.14
>>51
用途による
IntegerでもByteでもお好きな型をどうぞ
2011/12/4はシリアル値だと40881だけど、必要な範囲はプログラムの作者にしかわからないから

53 :デフォルトの名無しさん:2011/12/04(日) 09:46:54.70
>>52
Integerだと32000位までじゃなかったか?

54 :デフォルトの名無しさん:2011/12/04(日) 10:45:24.69
NumberFormatとNumberFormatLocalの違いは
なんですか?

55 :デフォルトの名無しさん:2011/12/04(日) 11:08:24.36
activecell.offset(1,0).select
activecell=10

activecell.offset(1,0).activate
activecell=10

これ結果は同じですよね?どちらがどういう理由で好ましいですか?

56 :デフォルトの名無しさん:2011/12/04(日) 11:23:59.67
>>54
NumberFormatLocalプロパティ
使用中のWindowsの国別情報に従った言語の書式記号が表示される
NumberFormatプロパティ
Exel既定の言語(英語)に従った言語の書式記号が表示される

基本、NumberFormatLocalを使っておけばOK

57 :デフォルトの名無しさん:2011/12/04(日) 11:26:58.13
>>56
なるほどよくわかりました。
Localは地球の地域という意味でのlocalだったんですね。
Thank you.

58 :デフォルトの名無しさん:2011/12/04(日) 14:20:50.44
時間を変数にするときも型はdateでOK?
あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)

59 :デフォルトの名無しさん:2011/12/04(日) 14:25:25.95
やりたいようにやれよ
いちいち他人に聞いてたら
出来るもんも出来んよ

60 :デフォルトの名無しさん:2011/12/04(日) 17:33:23.31
>>58
> あと、date型に日付だけを代入して使ってるときって時間の情報もたとえば0:00:00みたいなのがダミーで入ってるの?
> 逆の場合も疑問。(時間を代入したときは日付も入ってる?もしそうならそのときの日時は?)

なぜ試さん?

61 :58:2011/12/04(日) 17:38:50.35
みんなのVBA力と回答力を試しているんですが

62 :デフォルトの名無しさん:2011/12/04(日) 17:45:44.12
>>61
VBA力とか言ってる時点でみんなより自分が格下なのに気付けよ

63 :58:2011/12/04(日) 18:27:48.04
わからないなら無理にレスしてくれなくていいよ?

64 :58:2011/12/04(日) 19:36:00.70
>>63
こら、それはオレのセリフだ
ニセモノめが

65 :デフォルトの名無しさん:2011/12/04(日) 21:03:36.56
ここまでおれのじえん

66 :デフォルトの名無しさん:2011/12/04(日) 21:15:48.15
ツマンネ

67 :デフォルトの名無しさん:2011/12/05(月) 15:49:51.74
セルに色が塗ってて、
その色をRGB(x,y,z)で表すときのx,y,zの値を取得するにはどうすればいい?

68 :デフォルトの名無しさん:2011/12/05(月) 15:59:54.97
>>67
C = Range("A1").Interior.Color
R = C And &HFF
G = (C \ &H100) And &HFF
B = (C \ &H10000) And &HFF

69 :デフォルトの名無しさん:2011/12/05(月) 23:11:21.16
スレ違いでしたらごめんなさい

Excelを用いてオークションのシミュレーションをしたいのですが、そのためには何について学ぶべきですか?
参考となる書籍やサイトをご存知でしたら教えていただきたいです

現在、どうやらExcelでオークションのシミュレーションができそうだ、ということを知ったレベルです

よろしくお願いします。

70 :デフォルトの名無しさん:2011/12/05(月) 23:46:22.60
>>69
Sub オークションシミューション()
Dim a As Integer
a = Int(Rnd * 100 + 1)
If a <= 20 Then
ActiveCell = "あなたは入札に性交しました"
Else
ActiveCell = "あなたは入札に失敗しました"
End If
End Sub


71 :デフォルトの名無しさん:2011/12/05(月) 23:54:05.05
>>69
> Excelでオークションのシミュレーションができそうだ、ということを知った

どこで知ったのか知らんけど、そこで聞けよ。

72 :デフォルトの名無しさん:2011/12/06(火) 00:19:38.14
>>71
それはExcelでシミュレーションをできるということを知って、自分のやろうとしてることも恐らくできるだろうと判断しました

どこかの掲示板で聞いた、というわけではないんです

73 :デフォルトの名無しさん:2011/12/06(火) 00:25:40.24
>>72
> Excelでシミュレーションをできるということを知って

だから、どこで知ったんだよ。
て言うか、他人と会話したことないのか?

74 :デフォルトの名無しさん:2011/12/06(火) 01:00:52.64
>>69
まずオクのシミュレーションはどんな作りにしたいのかをフローにして、
その後VBAでどう言ったコードにすればいいかを
考えればいいんじゃないかな

75 :デフォルトの名無しさん:2011/12/06(火) 01:21:45.52
>>74
何から手を付ければいいかわからなかったので、とても参考になりました

ありがとうございます

76 :デフォルトの名無しさん:2011/12/06(火) 12:27:07.14
ネットワーク上の共有フォルダにアクセスしたいんですが
VBAからネットワーク認証を行うにはどうすればよいのですか?

77 :67:2011/12/06(火) 13:35:25.49
>>68
あなた頭いいですな
脳ミソ詰まってる
わたしにも分けてくれ

78 :デフォルトの名無しさん:2011/12/06(火) 21:38:46.64
別シートを操作するとき、そのシートをactivateしないとできないんだっけ?
でもできることもあるみたいだし。
でもそれを忘れてるか気にしないでいるとエラーが出ることもある。

どなたかこのしくみはどうなってるか教えてくれませんか?
非常に困っております。

79 :デフォルトの名無しさん:2011/12/06(火) 21:55:14.09
Excelで実際に操作するのと同じ様に使えばほぼ問題は無い。
でも、同じ操作で無くてもある程度は融通が利くよ。
って感じじゃね?
うまく動かなくて困ったら実際の操作を真似させる、で十分かと。
深く悩んだところで、MSの中の人すら完全に理解しているかどうか怪しいし。

80 :デフォルトの名無しさん:2011/12/06(火) 22:39:11.97
>>78
特定のシートオブジェクトを明示的に取得して、activate せずに、そのシートに対して操作することは可能
activate しないと使えない機能もあるが、どちらかというとレアじゃないかと思う

問題はマクロの記録とかで記録したコードについては activate前提のコードの書き方になっているということで、
記録したコードをそのまま使い回したいなら、アクティベートしたほうが無難だとは思う

81 :デフォルトの名無しさん:2011/12/06(火) 23:47:01.44
個人用マクロブックを作ったら
Excelを[X]で閉じようとしたときに
2回ボタンを押さないといけなくなりやがった。

これを防ぐ方法ある?

82 :デフォルトの名無しさん:2011/12/07(水) 06:47:38.01
最近vbaの勉強始めた
大村あつしさんの参考書使ってる
4月までには使えるようになりたい
プロ野球の選手成績を管理したいんだ
野球ゲームの成績まとめでも使いたいし

83 :デフォルトの名無しさん:2011/12/07(水) 08:39:20.32
>>81
なんてメッセージ出てんの?

84 :デフォルトの名無しさん:2011/12/07(水) 19:26:41.10
>>83
メッセージはなにも出ないんだ。
みんなも個人用マクロブックを作ってたらそうなってるんでしょ?

85 :デフォルトの名無しさん:2011/12/07(水) 19:27:27.27
>>82
http://yuzuru.2ch.net/test/read.cgi/gamespo/1323059897/14-
あなたはこの人ですか?

86 :デフォルトの名無しさん:2011/12/07(水) 20:52:36.60
>>78
activateしないとできないのは、copyメソッドとかpastespecialメソッドとかでしょ
他にもあったっけ
なぜできないのか、この辺の理屈がどうも分からないんだよな〜

87 :デフォルトの名無しさん:2011/12/07(水) 21:12:04.89
Pasteメソッドが、シートに対して行うというのも理解できない。
なぜそういう仕様になってるかおわかりのかたいらっしゃいますか?

88 :デフォルトの名無しさん:2011/12/07(水) 23:17:29.91
お知恵を拝借させてください。
下のように右クリックメニューから選択範囲のセルを塗りつぶす、みたいなことがしたいのですが、
「引数は省略できません。」のエラーになります。
どうすれば引数(例:34)を渡せますでしょうか?

Sub addMenu()
 Dim CB
 Set CB = Application.CommandBars("Cell").Controls.Add()
 With CB
  .Caption = "塗りつぶし"
  .OnAction = "setColor(34)"
 End With
End Sub

Sub setColor(col As Long)
 With Selection.Interior
  .ColorIndex = col
 End With
End Sub


89 :デフォルトの名無しさん:2011/12/08(木) 00:05:42.28
>>88
パージョンいくつ?

.OnAction = "'setColor(34)'"
又は
.OnAction = "'setColor 34'"
じゃないかな?(シングルクウォートで括る。)

ちなみに複数の引数を渡したい時は、自分の知ってる限りでは
.OnAction = "'setColor 34,4'"
とかでうまくいくハズ

90 :デフォルトの名無しさん:2011/12/08(木) 02:25:45.46
>>87
仕様の理由はわからんけど、動作見る限りエクセルVBAって
人が操作する動作をトレースしてるだけだから
手動で出来ないことはVBAでも出来ないってコトでいいんじゃね?

だからコピーもペーストもシートをアクティブにしないと出来ないと。

91 :デフォルトの名無しさん:2011/12/08(木) 09:27:07.74
>>90
VBの機能も使えるから出来ることは同じじゃない

92 :デフォルトの名無しさん:2011/12/08(木) 12:48:05.58
>>86,90
Sub test()
    Sheet2.Activate
    With Worksheets("Sheet1")
        .Range("C1:C5").Copy
        .Range("D1:D5").PasteSpecial _
            Operation:=xlPasteSpecialOperationAdd
        .Paste (.Range("E1:E5"))
    End With
End Sub

別にシートがアクティブじゃなくても使えますが?

>>87
(この場合の)Pasteメソッドがシートのメソッドなんだから対象がシートなのはまあ当然
RangeにPasteメソッドが無い理由なら解らん。PasteSpecialはあるのにな

どうせ操作対象をちゃんと指定してないから、アクティブシートが対象になってるだけだろ
アクティブじゃないとできない操作の実例教えてくれ


93 :デフォルトの名無しさん:2011/12/08(木) 14:00:27.28
Activateが必要だと思ってる奴はド素人

94 :デフォルトの名無しさん:2011/12/08(木) 19:50:51.44
どうせExcelのバージョンで挙動が違うとかいうオチだろ。
実際に使われる環境で正しく動けば、それで良いじゃん。

95 :デフォルトの名無しさん:2011/12/08(木) 22:05:52.74
>>89
できました!ありがとうございました。
バージョンは2003と2007です。

96 :デフォルトの名無しさん:2011/12/08(木) 22:14:25.21
さまざまな処理を各プロシージャが担当させるようにし
本体プロシージャはシンプルそのもの、
そしてプロシージャから他のプロシージャを呼び出しまくるような
かっこいいプログラミングがしたいです。
そんなスキル (=プロシージャを呼び出しまくるスキル) を学ぶに特化した学習用の本があれば紹介していただけますか?


97 :デフォルトの名無しさん:2011/12/09(金) 06:29:49.64
最近学習を始めたばかりの初心者です
わからないことがあったので質問させてください

VBAを使って
1、2500、5000、7500
の4つの数字をランダムで選ぶ
そしてこの動作を繰り返す

というプログラムはどうやって書けば良いのでしょうか
よろしくお願いします

98 :デフォルトの名無しさん:2011/12/09(金) 06:43:25.56
丸投げいくない

99 :デフォルトの名無しさん:2011/12/09(金) 06:54:05.47
>>98
すいません
できるか出来ないかだけでも教えていただけますか?
この4つをMT乱数を用いて選び出したいんです
そしてこの試行を繰り返す、という動作です

100 :デフォルトの名無しさん:2011/12/09(金) 07:12:39.98
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る

101 :デフォルトの名無しさん:2011/12/09(金) 07:17:25.61
数字を配列変数に代入
乱数を取得
乱数の3の余剰を求める
前記余剰を配列番号に与えてアタイを撮る
アタイをLogに出力

の上記をひたすら気が済むまでLoopする

102 :デフォルトの名無しさん:2011/12/09(金) 07:46:34.64
>>97
0〜3もしくは1〜4の整数の乱数の出し方知ってる?
配列(0)に1
配列(1)に2500
配列(2)に5000
配列(3)に7500
に入れておいて0〜3の乱数で3が出たら配列(3)の値を取得すればいい。
配列が分からなければCellsを使ってもいいだろう。
そんときゃA1〜A4に希望する数値を入れて1〜4の乱数を求め4が出たらCells(4,1)の値を取得すればいい。
最近は配列に入れないでCollectionに入れるDQNがいるけど。

103 :デフォルトの名無しさん:2011/12/09(金) 07:52:19.50
>>99
もちろん「できる」

ところでVBAの乱数って内部アルゴリズムは公開されてたっけ?
MT乱数の使用が必須条件なら自分で乱数発生プログラムも書く必要があるかも

104 :デフォルトの名無しさん:2011/12/09(金) 08:03:45.92
MT乱数 VBA

ヤホーでググればたくさん落ちてる

ちなみにワシは100-101だが
ボケてた。


3の余剰じゃなくって4の余剰だ

105 :デフォルトの名無しさん:2011/12/09(金) 08:06:06.37
みなさんありがとうございます
C言語の基本的なことはわかるので、配列で出来そうです

乱数は自分でプログラム書かなくても大丈夫だったような……

わからないことだらけなのでまた質問することもあるかとは思いますが、その時はよろしくお願いします

今回は皆さんのおかげで解決出来ました
ありがとうございます

106 :デフォルトの名無しさん:2011/12/09(金) 09:09:25.31
>>105
C言語の基本なことがわかってる奴が >>97 みたいな質問するのか?




と、思った奴は俺だけじゃないと思う。

107 :デフォルトの名無しさん:2011/12/09(金) 10:43:42.62
>>103
正式には公開されてないけど、どこかで解析されてたぞ。
MT乱数ならExcelで使えるdllがある。
なんか64bitのWindowsでは使えないみたいだが。
PtrSafeかましてもうまくいかん。

108 :デフォルトの名無しさん:2011/12/09(金) 10:46:17.93
うまくいかんのは64bitのExcelだった。

109 :デフォルトの名無しさん:2011/12/09(金) 20:35:25.18
VBA上だと変数のビット数が足りなくて完全なMTは実装できないとかなんとか

110 :デフォルトの名無しさん:2011/12/09(金) 21:43:02.26
'This is the Visual Basic for Applications (VBA) version of the MT19937ar,
'or "MERSENNE TWISTER" algorithm for pseudo random number generation,
'with initialization improved, by MAKOTO MATSUMOTO and TAKUJI NISHIMURA,
'of 2002/1/26.
'This translation to VBA was made and tested by Pablo Mariano Ronchi (2005-Sep-12)

http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/VERSIONS/BASIC/mt19937arVBcode.txt

111 :デフォルトの名無しさん:2011/12/10(土) 01:13:56.71
>>106
すいません
実はVBA触るのは今回が初めてでなにが出来てなにが出来ないのかがまるでわかってないんです

基本Cと同じく考えて良いんですかね

112 :デフォルトの名無しさん:2011/12/10(土) 01:31:07.91
>>111
まじめにCが普通に使える奴なら、VBA はマージン見ても一週間もあれば
それなりに使えるようになると思う。

ポインタは使えない (異論ある人もいるだろうけど、あえて言い切る) けど、
構造体もあるし、似たようなもんだと思っていい。

113 :デフォルトの名無しさん:2011/12/10(土) 01:48:34.83
>>112
Cが使えるか?と言われると中々自信が無いですけどね
基本は学んだことがあるので、コードを見てなにが書いてあるか位なら何となくはわかるかと

おかげで少しやる気がでました
とりあえずやりたいことに関する参考書でも探してみようと思います

114 :デフォルトの名無しさん:2011/12/10(土) 10:31:40.78
>>113
> コードを見てなにが書いてあるか位なら何となくはわかるかと

自分で書いたことはないってこと?
読めるのと書けるのの間はそれなりにある (例えば小説考えればわかるでしょ) ので、
一週間じゃ難しいかも。

幸いなことに VBA はネットにも本屋にも山ほど情報はあるから、じっくりがんばれ。

115 :デフォルトの名無しさん:2011/12/10(土) 12:09:19.41
>>109
そんなわけあるか
「多倍長」でぐぐれ

116 :デフォルトの名無しさん:2011/12/10(土) 12:10:05.05
文章と違ってコードは書くより読む方が難しいと思うんだけどなあ

117 :デフォルトの名無しさん:2011/12/10(土) 12:35:07.22
大は小を兼ねるから
変数の型は
integerやlongやは使わず
すべてdoubleにしていいですか?

118 :デフォルトの名無しさん:2011/12/10(土) 12:54:57.60
整数使いたいの?小数使いたいの?どっち?

119 :デフォルトの名無しさん:2011/12/10(土) 12:58:11.55
>>117
プログラムが複雑になってくると、最小限に切り詰めた方が計算は速くなるんだけど
そういう質問をするレベルなら大したプログラムは作らんだろうから、たぶん大丈夫

120 :デフォルトの名無しさん:2011/12/10(土) 13:03:28.16
すべてVariant使えばいいじゃん

121 :デフォルトの名無しさん:2011/12/10(土) 14:11:46.85
>>116
>文章と違ってコードは書くより読む方が難しいと思うんだけどなあ

読むと言う意味が違うんじゃない?

俺は、例えば I = I + 1 がどういう動作かわかるのを読むと言ってて、
貴方はプログラム全体がどういう動作するかをl理解することを読むと
言ってるんじゃない?

122 :デフォルトの名無しさん:2011/12/10(土) 15:52:32.15
そういえば変数じゃなくて定数は型宣言しなくていいんだっけ?
いま手元にあるVBAの本には定数のことについての説明が1ページもない。

変数は
Dim a as Integer
だけど、

定数は
Const a=3.14
みたいな感じ?
それとも
Const a as Double = 3.14
みたいに書くんだっけ?

123 :デフォルトの名無しさん:2011/12/10(土) 16:43:38.17
↓自分で作って動かしてるもの w

Public Const shisuu As Integer = 0
Public Const sakimono As Integer = 4


124 :デフォルトの名無しさん:2011/12/10(土) 16:48:13.30
Sendkeysステートメント(メソッド)を使って、他アプリケーションへの入力作業を行っています。
日本語入力の文字化け現象についてはVBAではどうにもならないと聞きました。
クリップボードを経由してもダメでした。

何か良い方法は無いでしょうか?

125 :デフォルトの名無しさん:2011/12/10(土) 17:16:54.06
ファイルから読み込みしたら?

126 :デフォルトの名無しさん:2011/12/10(土) 17:23:31.69
SendMessageすれば*

127 :デフォルトの名無しさん:2011/12/10(土) 20:02:53.99
>>126
ありがとうございます。
SendMessageについて色々調べてみましたが、今一理解できません。
失礼は重々承知ですが、使い方を教えて下さいませんか?

とりあえず、Yahooトップページの検索ボックス(既にフォーカスされているものとして)に
下記の文字列を送信するコードを教えて下さい。

"日本語で入力します。"


よろしくお願いします。

128 :デフォルトの名無しさん:2011/12/10(土) 20:36:01.01
定数はどうやって型宣言するんだっけ?
 Const a=3.14
みたいな感じ?
それともこう?
 Const a as Double = 3.14

129 :デフォルトの名無しさん:2011/12/10(土) 20:41:52.19
>>0x80
>>0x7B

130 :デフォルトの名無しさん:2011/12/10(土) 20:57:48.09
このスレ的には、

>>&H80
>>&H7B

じゃね?

131 :0x81:2011/12/10(土) 21:30:56.65
すまぬのう

ExcelVBAで組み込みCの色々なテーブルとかマクロ作って生活の足しに
しているんでな。

つーかワークシートの位置指すのにヘキサで書く理由がわからないですが
そういう仕事の人はいますか?(居たら事例を聞きたい)

132 :0x81:2011/12/10(土) 22:16:12.22
すまん、自分でも何言っているのかわからない。


まぁ、ワシのティンコは言うこときかないんですけどね。元気すぎて

133 :デフォルトの名無しさん:2011/12/10(土) 22:36:49.98
>>127
Sub yahoo_search()
  Dim objIE As Object
  Set objIE = CreateObject("InternetExplorer.application")
  objIE.Visible = True
  objIE.navigate ("http://yahoo.co.jp")

  Do While objIE.ReadyState <> 4
    DoEvents
  Loop

  SendKeys "日本語で入力します。"
  SendKeys "{ENTER}"
End Sub

134 :デフォルトの名無しさん:2011/12/11(日) 00:00:06.36
VBAのSendKeysは普通に日本語送れるけど
>>124はどういう状況なんだろう

135 :デフォルトの名無しさん:2011/12/11(日) 00:13:24.16
2バイト文字入力で化けるソフトがあって、その入力支援が出来ません
ってことかな

表示がバグるだけで内部データは問題ないんじゃね

136 :0x81:2011/12/11(日) 00:20:33.70
ADOと使って変換すればいけるの?

137 :デフォルトの名無しさん:2011/12/11(日) 00:30:15.04
>>133
>>134
すみません!完全に私の記述ミス&勘違いです!!
エクセルファイルの各内容を変数に取得して、
社内システムにフォーカスを移して入力を試みています。

半角文字列や数字は問題なく入力できるのですが、
全角文字列(日本語)をSendkeysで送っても文字化けしてしまうのです…

文字化けしないようにするにはSendMessageを使う必要があるって聞きましたが、
使い方がよく分かりません。お手数掛けてすみませんが、ご教授お願いします。

138 :デフォルトの名無しさん:2011/12/11(日) 00:31:36.91
>>135
え、そうなんですか?
月曜日に確認してみます!
ありがとうございます!!

139 :デフォルトの名無しさん:2011/12/11(日) 00:46:38.45
>>137
全角文字とSendKyesの組み合わせだと、
入力したい全角文字列をクリップボートにコピーしてから、SendKeys で Ctro+V のみを送るって方法がある


140 :デフォルトの名無しさん:2011/12/11(日) 00:54:48.00
>>139
ありがとうございます。
でも、 ^V って何故だか動作しませんでした…

141 :デフォルトの名無しさん:2011/12/11(日) 00:56:06.62
>>139
なるほど

みんな苦労してるんだなあ
うちもツギハギのWEBアプリで四苦八苦してるよ
十何年もかけて機能の拡張やバージョンアップを繰り返してるから画面のデザインとか操作体系がめちゃくちゃになってる
支店が全国に一万店以上あるからうっかり大幅に変更すると再教育のコストもかかるしどうにもならなくなってきてる

142 :デフォルトの名無しさん:2011/12/11(日) 01:15:47.91
うーん、確かにメモ帳だと SendKeys "^v" で貼り付けできるのにIEだとできないね
何度も試してるとできることもあるけど、再現条件がわからん
Sleepで待ち時間を入れてもDoEventsをはさんでも同じ
半角だと貼れるのに全角は貼れない
わけがわからん

143 :デフォルトの名無しさん:2011/12/11(日) 01:19:34.66
VBAでDOSコマンド書いてそこから介入

144 :デフォルトの名無しさん:2011/12/11(日) 01:45:06.76
できた
VBAのSendKeysではうまくいかないけど、VBSのSendKeysならうまくいくことがわかった
以下のサンプルはクリップボードにデータを設定する部分で警告が出るけど、そこは問題の本質じゃないので無視してくれ

Sub yahoo_search()
  Set IE = CreateObject("InternetExplorer.application")
  IE.Visible = True
  IE.navigate ("http://yahoo.co.jp")
  Do While IE.ReadyState <> 4  '表示終了まで待つ
    DoEvents
  Loop

  Set ws = CreateObject("Wscript.Shell")

  IE.Document.ParentWindow.ClipboardData.SetData "text", "英語を貼り付ける。"
  ws.SendKeys "^v"
End Sub

145 :デフォルトの名無しさん:2011/12/11(日) 07:23:03.30
っていうか相手がIEだったら(>>124
SendKeysなんか使わずにDOM操作した方がよくない?
例えば>>133のコードを拝借すると、SendKeysの2行をこんな風にする

objIE.Document.getElementById("srchtxt").Value = "日本語で入力します。"
objIE.Document.getElementById("srchbtn").Click

対象がすでに表示中のIEだと捕まえるのがちょっと面倒だけどね

146 :145:2011/12/11(日) 07:25:19.85
うわ編集中に送ってしまった
1行目
っていうか相手がIEだったら(>>124

っていうか相手がIEだったら(>>124は「社内システム」としか書いてないからわからんけど)

147 :デフォルトの名無しさん:2011/12/11(日) 09:07:00.03
環境 XP、Office2003

[Sheet1]
Private Sub Worksheet_Calculate()
Worksheets("Sheet1").操作()
End Sub
という事を実現したいが、シート名は可変です。
で、
Private Sub Worksheet_Calculate()
ActiveSheet.操作()
End Sub
という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。

(手元にExcelがないのでコードは不正確かもしれません)

148 :124:2011/12/11(日) 09:16:05.26
>>142-146
お返事が遅くなりすみません。
社内システムはIEではありません。
.exeファイルです。

…VBSのSendkeysとか想像もしてませんでした。
DataObjectでクリップボードに格納して、VBSのSendkeysを試してみます。
いずれにせよ、月曜日じゃないと確認できませんが。。。

何度もアドバイス下さり、本当にありがとうございます!
また、結果などをご報告いたします。

149 :デフォルトの名無しさん:2011/12/11(日) 10:35:28.06
>>147

ブックの"Sheet1"という名前のシートに操作をするなら

For i = 1 To ActiveWorkbook.Sheets.Count
If ActiveWorkbook.Sheets(i).Name = "Sheet1" Then
操作
End If
Next

にしたらいかがでせうか

150 :149:2011/12/11(日) 10:36:30.35
レスを良く見てなかったんで
取り消してくらはい

151 :デフォルトの名無しさん:2011/12/11(日) 11:31:08.05
>>147
>という例を見かけますが、この場合 ActiveSheet が Sheet1 という保証はあるのでしょうか。

当然そんな保証はない。

「シート名は可変です。」と書いてあるが、ではソノシート名はいつどこで指定するのか?

あらかじめ指定しておくと言うなら、

Dim SheetName As String

Private Sub Setup( )
 SheetName = "Sheet1"
End Sub

Private Sub Worksheet_Calculate( )
 Worksheeets(SheetName).操作( )
End Sub

でいい。
Sheet1 がないケースなどがあるなら、適切なエラー処理が必要。

152 :デフォルトの名無しさん:2011/12/11(日) 11:34:28.91
あと、本来名前でいろいろ参照するのはお勧めしない。
>>151 の例なら、

Dim TargetSheet As Worksheet

Private Sub Setup( )
 Set TargetSheet = Worksheets("Sheet1")
End Sub

Private Sub Worksheet_Calculate( )
 TargetSeet.操作( )
End Sub

の方が (個人的には) よりいいと思う。

153 :デフォルトの名無しさん:2011/12/11(日) 11:40:53.64
>>147
Worksheet_Calculateイベントはアクティブシートがどこにあっても発生する可能性があります
シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです

[Sheet1]
Private Sub Worksheet_Calculate()
  操作()  ' ←これだけ
End Sub

154 :デフォルトの名無しさん:2011/12/11(日) 12:27:23.26
シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。

For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next


155 :デフォルトの名無しさん:2011/12/11(日) 12:31:01.24
>>147
すんまそん、アンカ忘れてた。
今からカリ首吊ってくる


シート番号指してシート名取得してその名前が欲しいシート名と一致ならば処理すれば?
変なエラーが起こらない。

For I = 1 To Worksheets.Count
If Worksheets(I).Name = "Hoge" then
'やりたいことやる
endif
Next


156 :デフォルトの名無しさん:2011/12/11(日) 15:20:43.60
Excel:2007、OS:Win7

上書き保存時、セーブ前に行列番号を消し、保存後、行列番号を再度表示させたいです。
ビュアーで見る時に番号を消したい、という意図です。
とりあえず調べた限り、以下でいいと思ったのですが以下の問題点でつまずいています。
・そもそも保存されない
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し

ThisWorkbook.Save 'セーブ。できてない?

Cancel = True '通常の上書き保存をキャンセル

.DisplayHeadings = True '行列番号表示
End With
End Sub


157 :デフォルトの名無しさん:2011/12/11(日) 15:59:31.16
>>156
環境が無いんで確認できないけど、
ThisWorkbook.SaveがWorkbook_BeforeSaveを誘発してるでしょ。
自分で聞いてやるしかないと思うよ。
Msgbox("保存しますか?",vbYesNo)
Yesなら
Application.DisplayAlerts = False
ThisWorkbook.Save
Application.DisplayAlerts = True
メッセージは、Ctrl+S時に表示しちゃまずいから、
BeforeCloseで保存確認しちゃった方がいいかもね。

まぁ結局はWorkbook_openで
DisplayHeadings = True '行列番号表示
しちゃう方が簡単だと思うんだ。

158 :デフォルトの名無しさん:2011/12/11(日) 16:09:24.49
>>156
Saveの直前にイベント抑止してみるとか

Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True

ただ、保存されたものは常に行番号なしになるのでopen時には再度行番号有効化してやるとかの考慮は必要になる
あと、実際に保存された直後、
.DisplayHeadlings = True
の行でおそらく編集扱いになるので、ただ閉じようとしても必ず
保存しますか?
と聞かれてしまうのは仕方ないように思える

159 :デフォルトの名無しさん:2011/12/11(日) 16:13:35.98
157>>
返信ありがとう!

上司からのオーダーなもんで出来るだけ対応したいんだけどねぇ。
Ctrl+Sでやりたいから、必ずしもウィンドウを閉じる時ばかりじゃないもんで。
俺もこれを聞く前に閉じるときにセーブ前に非表示→開くときに表示というふうに
したんだけどそれだとダメらしい

出来ればCtrl+Sとかでも対応できるようBeforSaveでやりたいが……
自前の保存マクロでやるしかないかな……

160 :デフォルトの名無しさん:2011/12/11(日) 16:21:54.14
>>158
>.DisplayHeadlings = True
>の行でおそらく編集扱いになるので
ThisWorkbook.saved=Trueでどう?

161 :デフォルトの名無しさん:2011/12/11(日) 16:23:43.56
>>158
こっちもありがとう!

イベントの抑制・・・そういうのもあるのですね。参考にしてみる。
開くときに表示ON自体は_OpenでしてやればOKですね。実際それはもう仕込んであるので。

しかし、なるほど、結局、表示消すのが編集扱いになってるから何ども聞かれるのか。
そりゃそうだわな……

162 :デフォルトの名無しさん:2011/12/11(日) 17:45:20.24
>>160
遅れたがサンクス。

とりあえず各アソバイスを入れた結果、Ctrl+Sで保存で行が消せるようになった!
ビュアーでみてもちゃんと消える。
ただ
・ブックを閉じようとすると上書き保存するか聞かれるが保存するを選んでも何度も同じことを聞かれる。
いいえかキャンセルのみで抜けられる。
は解消されないな……一度保存すればあとはいいえ押せばいいだけなんだけどね。
ThisWorkbook.Saved = Trueの使い方がまずい?


Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean _
, Cancel As Boolean)
With ActiveWindow
.DisplayHeadings = False '行列番号消し

'Application.DisplayAlerts = False

Application.EnableEvents = False
ThisWorkbook.Save 'セーブ。できてない?
Application.EnableEvents = True

Cancel = True '通常の上書き保存をキャンセル

.DisplayHeadings = True '行列番号表示
ThisWorkbook.Saved = True '変更適応OK
End With

'Application.EnableEvents = False
End Sub
※その他、Open時とClose時にそれぞれ行列表示のOn,Offをいれてます。

163 :デフォルトの名無しさん:2011/12/11(日) 20:16:58.40
>>162
EXCEL2000ならあったから入れてみた。
http://ideone.com/tn9oN
出来てるとは思うけど、
割と脆弱なロジックなので、限られた範囲での使用に留めるべき。
仕事であれば別にボタンを用意するかな。

164 :デフォルトの名無しさん:2011/12/11(日) 22:57:32.48
あ、vbNoの処理間違ってた。
Saved=Trueが必要かな

165 :147:2011/12/11(日) 23:51:37.67
Worksheet_Calculate()時のActiveSheetは自シートか?という質問に関し、
>>149-155
ありがとうございました。勉強になります。手元にExcelが無いので明日試させて頂きます。

が、理解を超えている点があるので再質問させて下さい。
>>153
> シートモジュールの中で自分自身に対して何か処理をしたい場合はシート名を書かなければ良いだけです
その場合、省略された自分自身を表わす記法はどのようになりますか?
例えば、自シートをローカル変数に代入したいとか。(他モジュールで使い回したいような目的で)

[Sheet1]
' Set SelfSheet = Worksheets("Sheet1") 相当をシート名無しで実現するには?
Dim SelfSheet As Worksheet
Set SelfSheet = ' ThisWorksheet と書きたいが。

166 :デフォルトの名無しさん:2011/12/12(月) 00:26:16.12
>>165
俺はそんな時 Me を良く使うお
Set SelfSheet = Me

167 :デフォルトの名無しさん:2011/12/12(月) 00:31:30.30
すいません、質問が
VBAを使って、
Aというセルに数値を入れた時に、BというセルにそのAに入れた数値によって様々な値を出力する
というのを作りたいのですが、どうすればいいのでしょうか

168 :デフォルトの名無しさん:2011/12/12(月) 01:24:37.73
>>167
セルBにセルAを参照する数式を記述する

169 :デフォルトの名無しさん:2011/12/12(月) 01:24:46.11
質問です

mnock = 1: hno = 1の
:ってどういういみなんですか?

代入を一行に書いたわけではないんですよね・・・

170 :デフォルトの名無しさん:2011/12/12(月) 01:56:23.33
改行の代わり

171 :デフォルトの名無しさん:2011/12/12(月) 01:59:19.61
>>170
そうなのか・・・特殊記号かとおもってしまいました
ありがとう

172 :デフォルトの名無しさん:2011/12/12(月) 09:47:18.15

範囲指定をして何か処理(ソートとか)した後、その選択範囲が選択されたままになってしまいますが、それを解除する命令
とかってありますか?
何処かのセルを選択すればそれが解除されはするんですが、それとは別に言ったような選択を解除するようなものがあるのか
?と思いまして。


173 :デフォルトの名無しさん:2011/12/12(月) 10:21:17.05
未選択状態見たこと無いから無いんじゃない?

174 :デフォルトの名無しさん:2011/12/12(月) 10:23:20.77
thxです
やっぱり無いですかね w


175 :デフォルトの名無しさん:2011/12/12(月) 11:18:55.59
質問があります。

OS:Windows 7 Ultimate 64bit SP1
Excelのバージョン:Office 2007 Personal SP3

A1-A10までのセルのいづれか1つに*が入力されたら、それ以外のA1-A10のセルを空にしたいです。(排他?)

※A1-A10のうち、*が入力されているのは常に1つの状態にしたいという事です。

よろしくお願いします。

176 :デフォルトの名無しさん:2011/12/12(月) 12:02:31.09
わーくしーとあふたーあっぷでーと()

A1〜10に入力があったら他排除

えんどサブ

177 :175:2011/12/12(月) 12:35:42.16
>>176
すみませんが、貴方の言う「A1〜10に入力があったら他排除」が分からないと質問をしているのです。
回答する気がないのであれば、中途半端なレスはいりませんよ、176さんも暇じゃないでしょうから。

178 :デフォルトの名無しさん:2011/12/12(月) 12:43:30.40
>>177

>>2

179 :デフォルトの名無しさん:2011/12/12(月) 13:07:20.85
>>175
おまえの態度が気に入らない
VBAを勉強する前に掲示板の使い方を覚えろ

Private Sub Worksheet_Change(ByVal Target As Range)
  Application.EnableEvents = False
  r = Target.Row
  c = Target.Column
  If c = 1 And r <= 10 Then
    If Cells(r, c) = "*" Then
      Range("A1:A10").Clear
      Cells(r, c) = "*"
    Else
      Intersect(Target, Range("A1:A10")) = ""
    End If
  End If
  Application.EnableEvents = True
End Sub

180 :175:2011/12/12(月) 13:12:20.64
>>179
態度を改めます。
掲示板の使い方も覚えます。
コードありがとうございました。

181 :デフォルトの名無しさん:2011/12/12(月) 13:16:48.65
ああごめん、フックが解んないかと思ってたわ

182 :デフォルトの名無しさん:2011/12/12(月) 14:02:21.15
>>163
サンクス。かなり参考にさせてもらった。
でもブックを閉じた時、保存ではいを押しても保存出来ないっぽい。2007の差でもあるのか

ちなみに皆さん、マクロ配布するときどうしてます?
エキスポートでcls出してインポートで使わせようと思ってもthis bookに書かなきゃうまくうごかなかった。そもそもVBAわざわざ開かせるのも微妙で。



183 :デフォルトの名無しさん:2011/12/12(月) 14:16:59.61
>>172
Application.CutCopyMode = False じゃないのか?

>>182
プログラムの入ってるブックとデータの入ってるブックは別にして
配布はプログラム用のEXCELブックを丸ごと配布する

184 :デフォルトの名無しさん:2011/12/12(月) 14:24:08.14
オブジャクト指向ってなんですか?

185 :デフォルトの名無しさん:2011/12/12(月) 14:33:16.67
オブジェクト指向は、継承とポリモルフィズムです
smalltalkという言語が有名

186 :184:2011/12/12(月) 14:39:05.33
わたしが聞いてるのは「オブジャクト指向」のほうなんですが

187 :175:2011/12/12(月) 15:34:06.89
>>179
度々すみません。
*の排他入力?は出来たのですが、
文字列の中央揃えなどの設定が消えてしまいます。

188 :デフォルトの名無しさん:2011/12/12(月) 15:41:17.73
書いてあるコードググれよ

宿題なら自分でやりな

俺が聞く時に雰囲気悪くなったらどーすんだ!

189 :デフォルトの名無しさん:2011/12/12(月) 15:54:57.59
それを気にするほどのやわな神経なんてないだろ

190 :デフォルトの名無しさん:2011/12/12(月) 17:16:44.25
VBAでシート関数はApplication.Sheetfunction.[関数]と書けばどんなものもつかえる?

191 :デフォルトの名無しさん:2011/12/12(月) 18:27:00.97
>>187 >>175

>>2
>★5 レベルはどうあれ、ここはプログラマ用の板スレです。プログラマとは、自分でプログラムを組み、
>   コードを書く人の事なので、自分でやるきは全く無く、丸投げしようって人はお断りです。
>   ヒントを貰えばあとは自力でなんとかしますって人のみどうぞ

と書いてあるんだが 読んだのか?

192 :デフォルトの名無しさん:2011/12/12(月) 18:35:15.73
>>191
当たりまえです
>>187を聞いてるのに関係ない話で誤魔化さないでください
わかりもしない、答える気もない屑が掲示板を荒らすのは本当に不愉快です

193 :デフォルトの名無しさん:2011/12/12(月) 18:36:47.91
オレ ジエン ここまで ぜんぶ

194 :デフォルトの名無しさん:2011/12/12(月) 18:41:50.97
>>192
偽者乙

195 :デフォルトの名無しさん:2011/12/12(月) 18:43:55.77
俺の自演って言ってるじゃないですカー!

196 :デフォルトの名無しさん:2011/12/12(月) 19:39:03.96
中央でそろえるとか、マクロの記録があるんだからそれ使えばいいじゃない
そのコードを今までのに追記するだけなんだし。

ここでやり取りしてる時間の方が無駄でしょ

197 :デフォルトの名無しさん:2011/12/12(月) 19:51:40.07
>>190
使えないものもあるよ。そういう時はEvaluateを使うみたいだけど。


198 :124:2011/12/12(月) 20:29:23.23
今日、会社で色々試しました。
解決策は意外な盲点にありました。

私はSendkeysはApplicationクラスのものを利用していましたが、
(こっちの方が安定性が高いらしいので)
普通のSendkeysを使用したら文字化けしませんでした。
それからメニュー等を操る時は、大文字入力だと失敗することが多いですね。

いずれにせよ、親身にアドバイスを下さった皆さん、
本当にありがとうございました。

199 :デフォルトの名無しさん:2011/12/12(月) 20:38:26.96
そういや「Sendkeysステートメント(メソッド)」って書いてたもんな
なんでメソッド?と微妙にひっかかっていたがそういうことか

200 :175 ◆txEbeGmJyg :2011/12/12(月) 20:47:44.09
>>191
すみません。
他にExcelのVBAスレが見当たらなかったもので、勝手は承知で質問してしまいました。

>>196
失礼ですが、このスレの回答側の人はその程度のレベルなんですか?

>>179
さきほど、.Clearの所を= ""にしたら、できました。
あえて、勉強のために.Clearを使って書いてくれたのかな?


201 :デフォルトの名無しさん:2011/12/12(月) 21:09:47.60
質問者が恐らく理解出来るだろう内容で回答してるよう見えるけど

202 :175 ◆txEbeGmJyg :2011/12/12(月) 23:31:06.38
>>201
私が言っているのは>179さんに対してではなくて、>196さんの発言に対してです。

>179さんのコードは綺麗だと思います。
.Clearメソッドを使った意図が、私に学習させるためなのかなと思っただけです。
なので、>179さんには感謝はすれど文句はありません。

203 :175 ◆txEbeGmJyg :2011/12/12(月) 23:46:11.89
度々すみません。

>>179さんの書いてくださったコードで、
>r = Target.Row
という部分があると思いますが、これをAとかBで指定できるように
したいのですが、何かうまい方法はありますでしょうか?

これを、If c = 1 And r <= 10 Then
こうしたいです。
Dim strRowPos as String
strRowPos = A
If c = strRowPos And r <= 10 Then

ここを見て調べているのですが見つけられなくて。
www.eurus.dti.ne.jp/yoneyama/Excel/vba/index.html

度々すみませんが、179さんか分かる方いたら教えてください。
どうかよろしくお願いします。

204 :175 ◆txEbeGmJyg :2011/12/12(月) 23:48:55.32
またまたすみません。

Dim strRowPosA as String
Dim strRowPosN as String
strRowPosA = A
'
'ここで、strRowPosAを数値にして、strRowPosNに入れたいということです。
'その変換方法がないかなと。
'
If c = strRowPosN And r <= 10 Then



205 :デフォルトの名無しさん:2011/12/12(月) 23:50:01.50
うーーーーーぜーーーーーーーーーーー

206 :175 ◆txEbeGmJyg :2011/12/12(月) 23:50:34.30
だぁ・・・。
スレ伸ばしてすみません。

誤)Dim strRowPosN as String
正)Dim strRowPosN as Integer

207 :デフォルトの名無しさん:2011/12/13(火) 00:11:04.02
スレチ押し通すなっての。
既に聞く態度じゃないとと取られてんだし、誰も真面目に答えないよ?

208 :175 ◆txEbeGmJyg :2011/12/13(火) 00:20:56.52
>>207
失礼ですが、どこがスレチなんでしょうか?
>>2の>★5と指摘されたので、調べつつ少しなりとも自分でやっているんですけど。
聞く態度じゃないというのも具体的に分かりませんが、改めて私のできる範囲で丁寧な
言葉でレスしているのですが。

ちなみに、誰も答えないとおっしゃられていますが、それは貴方の推測ですよね。
事実、もしそうであれば>>178でレスが止まっているはずですが、>>179氏はちゃんと指摘
とレスをしてくれましたよ。

質問者の立場で何ですが、一言あなたに言わせていただくと、あなたは回答できないので
はないですか?
基本2chて自分が嫌だと思ったらスルー推奨ですよね。


それで結果的にスマートではないと思うのですが、26進数変換の関数を作って対処(仮)しました。
もしもっと、いい方法を知っている方いらっしゃいましたら、教えていただけると助かります。



209 :デフォルトの名無しさん:2011/12/13(火) 00:23:31.37
http://gigazine.jp/img/2011/01/11/goukaku_snack/DSC_9293.jpg
スレチ?

210 :デフォルトの名無しさん:2011/12/13(火) 00:26:48.21
http://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%80%E3%83%81

211 :デフォルトの名無しさん:2011/12/13(火) 00:37:20.63
http://missaoyama2008.camcolle.jp/blog/media/27/20080924-1222184378.JPG
トモダチ

212 :デフォルトの名無しさん:2011/12/13(火) 00:41:06.61
ttp://www.zukan-bouz.com/aji/buri/buri.image/buri.jpg

213 :デフォルトの名無しさん:2011/12/13(火) 00:41:27.05
超初心者です・・・

Sub 例題()

Dim n As String

For n = 1 To 10

Cells(n, 1) = n

If n Mod 2 = 0 Then

Cells(n, 2) = " 偶数 "

End If

Next n


End Sub


で型が一致しないとでるのですがどうすればよいでしょうか

214 :デフォルトの名無しさん:2011/12/13(火) 00:42:11.55
ちょっと煽られただけですぐ感情的に反論するとか、どんだけ子供なんだよ
気に入らないレスは無視しろ
正論でも印象悪い
書き間違いが多すぎる
書き込む前に3回読み直せ

strRowPosA = A ← これは不可能。こういう書き方だとAは変数名になってしまう

やるならこう

strRowPosA = "A"
strRowPosN = Cells(, strRowPosA).Column

さらに言えば、ワークシートのA、B、C…はRowじゃなくてColumnだから、全体を修正すると

Dim strColumnPosA as String
Dim strColumnPosN as Integer

strColumnPosA = "A"
strColumnPosN = Cells(, strColumnPosA).Column

If c = strColumnPosN And r <= 10 Then

215 :デフォルトの名無しさん:2011/12/13(火) 00:44:37.64
>>213
○ Dim n As Integer
× Dim n As String

授業はちゃんと聞こうね

216 :175 ◆txEbeGmJyg :2011/12/13(火) 00:49:58.79
>>214
すみません。
指摘感謝です。
>179さんかな?
コードありがとうございました!

217 :デフォルトの名無しさん:2011/12/13(火) 00:55:07.20
202
>>196ですら君は及ばないレベルだと自覚出来ない時点でもうね

218 :デフォルトの名無しさん:2011/12/13(火) 00:56:20.86
>>215
ありがとうございました^^

67 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.02.02 2014/06/23 Mango Mangüé ★
FOX ★ DSO(Dynamic Shared Object)