>>174 >>168じゃないが rangeオブジェクトから行番号や列番号なんてただの数値を取り出して、その数値をもとにどこのブックのどこのシートのCells(*,*)なんて実行時バインドで参照を作り出すのはアホだな Rangeオブジェクトならどこのブックのどこのシートかなんて内包されてるんだから、それを利用するのが当然だろう for i = 1 to cells(rows.count,1).end(xlup).row なんてのは欠陥というより下手くそだね セレクトするコードと目くそ鼻くそだよ
下記で右辺のRGBでコンパイル・エラーargument not optionalがでて 進めません。(XP + Excel2000)
Sub Test() Dim myIndex As Variant Dim length As Integer myIndex = Array("235,180,200", "255,110,80", "255,0,0") For i = 0 To 2 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 50 * i, 100, 50 * (i + 1)).Select Selection.ShapeRange.Fill.ForeColor.RGB = RGB(myIndex(i)) 'error Next i End Sub
Sub Test() Dim myIndex As Variant Dim length As Integer myIndex = Array(Array(235, 180, 200), Array(255, 110, 80), Array(255, 0, 0)) For i = 0 To 2 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 50 * i, 100, 50 * (i + 1)).Select Selection.ShapeRange.Fill.ForeColor.RGB = RGB(myIndex(i)(0), myIndex(i)(1), myIndex(i)(2)) Next i End Sub
188 名前:デフォルトの名無さん [2010/02/05(金) 23:24:09 ]
>>187,185 ありがとう。こうしました。 Sub Test() Dim myIndex As Variant Dim length As Integer myIndex = Array(RGB(235, 180, 200), RGB(255, 110, 80), RGB(255, 0, 0)) For i = 0 To 2 ActiveSheet.Shapes.AddShape(msoShapeRectangle, 0, 50 * i, 100, 50 * (i + 1)).Select Selection.ShapeRange.Fill.ForeColor.RGB = myIndex(i) Next i End Sub
もっとも不細工(cells(i,1)の形が実行時バインド) dim i as long For i = 1 To cells(rows.count,1).end(xlup).row If cells(i,1).value="foo" then cells(i,2).hogehoge end if Next i
まだまだ不細工(Itemプロパティが実行時バインド) dim r as range dim i as long set r =range(cells(1,1),cells(rows.count,1).end(xlup)) for i=1 to r.count If r.item(i,1).value="foo" then r.item(i,2).hogehoge end if next i
上の二つよりまとも(cは事前バインド) dim r as range dim c as range set r =range(cells(1,1),cells(rows.count,1).end(xlup)) for each c in r if c.value="foo" then c.offset(,1).hogehoge end if next c
>>212 161じゃないけど、発見した行の4列目ならfound.EntireRow.Cells(4)ってことかな? しかしまぁ>>151は検索範囲がB列と書いていながら、実際のコードは何故か Set found = Worksheets("全データ").Cells.Find(sn, , xlValues) と全セルになってるな。
Private Sub 技術検索ボタン_Click() Dim sn As String '検索番号の設定 sn = 技術検索番号.Value '検索の処理 With Sheets("全データ") Set found = Worksheets("全データ").Range("B:B").Find(sn, , LookAt:=xlWhole) '見つからない場合の処理 If found Is Nothing Then MsgBox ("技術コードが見つかりません。5桁の数字を正しく入力してください。") '見つかった場合の処理(フォーム上のtextboxに値を代入) Else Me.会社名表示.Value = .Cells(found.Row, 4) Me.処理機郵便番号表示.Value = .Cells(found.Row, 5) Me.処理機住所表示.Value = .Cells(found.Row, 6) Me.電話番号表示.Value = .Cells(found.Row, 10) Me.メールアドレス表示.Value = .Cells(found.Row, 9) Me.事業区分表示.Value = .Cells(found.Row, 11) End If End With End Sub
VB(A)の世界では、Dim a As Rangeなどと、変数宣言時にオブジェクトの型を指定するのが 事前バインディング、Dim a As Objectと総称型で宣言し、Set a = ...と実行時に変数に結びつけるのが 実行時バインディングというのが普通で、上で言われてるような文脈で使われるのは 初めて見た。 あってるのか、間違ってるのか知らんけど。
11sec: s = Range("A1").Value 05sec: s = Cells(1,1).Value 04sec: s = r.Value
241 名前:151 mailto:sage [2010/02/08(月) 12:22:11 ]
横からすみません。分かりにくい点が多数あると思いますがお願いします。
A B C D E l F 1 名前 りんご バナナ みかん ブドウ l 余り 2 たけし 1 0 0 4 l 0 3 ともこ 0 2 0 4 l 0.25 4 とおる 1 2 3 0 l 0.73 5 さちこ 1 2 0 0 l 0 6 たける 0 0 0 4 l 0.84 ・ ・ ・ というような表を作っています。 フォームでりんごを選択し検索すると、りんごを食べれる【たけし・とおる・さちこ】 を検索(B2:E6から1を検索)し、与えます。 余りがあればさっき与えた人以外のところに持っていき、与えます。 それを繰り返して、条件付き組み合わせのような形で検索したいと思っています。 この場合ですと、リンゴを100個持っているとすると、 ※()内は残個数
Sub test1() ActiveSheet.Shapes.AddShape(msoShapeRectangle, 10, 10, 50, 50).Select With Selection .Characters.Text = "あ" End With Range("a1").Select End Sub
Sub test2() MsgBox ActiveSheet.Shapes(1).Characters.Text End Sub
>>249 Sub test1() With ActiveSheet.Rectangles.Add(10, 10, 50, 50) .Text = "あ" .HorizontalAlignment = xlHAlignCenter .VerticalAlignment = xlVAlignCenter End With End Sub
For i1=… ’ここにi1の処理(※) For i2=… ’ここにi2の処理(※) For i3=… ’ここにi3の処理 Next i3 Next i2 Next i1
と階層化されている場合、各段階で条件によって終了し、i1に戻って再度処理を続けるにはどうしたらいいですか? (i2,i3である値が0になったときなど) ※のところに If a = 0 Then Next i1 ではだめでした。 コード自体が長いのでこのような質問になり申し訳ありません。 よろしくお願いします。
'果物番号 fruit = Worksheets("sheet1").Range("E10") aRow = 1 aCount = 0 '================================================= For i1 = 2 To 6 '検索する行を指定 '果物番号の検索 With Worksheets("sheet1") Set found1 = Worksheets("sheet1").Range(.Cells(i1, 2), .Cells(i1, 5)).Find(fruit, , LookAt:=xlWhole) End With
If found1 Is Nothing Then Else '最初の人の余り(率)を取得して書き込み s1 = Worksheets("sheet1").Cells(found1.Row, "A") ’s1は最初に食べる人 out_rate1 = Worksheets("sheet1").Cells(found1.Row, "G") aRow = aRow + 1 Worksheets("sheet2").Cells(aRow, 1) = s1 '排出物 out1 = Worksheets("sheet1").Cells(i1, 8) '================================================= For i2 = 2 To 6 (以降続く)
Sub main() If ChkShtName Then MsgBox Now End If End Sub
Function ChkShtName() As Boolean If ActiveSheet.Name <> "xoxo" Then MsgBox "シートは:" & ActiveSheet.Name ChkShtName = False '(1) ここで本当はmainを抜けたい Else ChkShtName = True End If End Function
>>265 それはbook3もあって一つ前にアクティブだったかわからないという事か? ↓コピペだけど Sub マクロブックでない方のファイル名を取得する() Dim オブジェクト As Workbook For Each オブジェクト In Workbooks If オブジェクト.Name <> ThisWorkbook.Name Then MsgBox オブジェクト.Name End If Next End Sub もし2つしかbook開いていないなら上記で 2つ以上でもアクティブなBOOK名を絶えず取得して置けばいいと思ったけど マクロ書いたbookを最後に開いたら駄目だね
268 名前:255 mailto:sage [2010/02/11(木) 15:25:13 ]
>>267 book3,book4,book.......と複数ブックが 開いている状態でbook2(マクロを登録したファイル)をアクティブ にしてその中のマクロを実行するときに ひとつ前にアクティブだった任意のブック(book1 or book3 or ......) をアクティブにする方法です。 activewindow.activatepreviousではウインドウが開いた順番をもとに ひとつ前の番号のウインドウをアクティブにするだけなので、
★標準モジュール Private GetOldBook As New Class1 '←クラスモジュール名を指定する Sub TEST() Debug.Print "一つ前にアクティブだったブック:"; GetOldBook.Name End Sub
★クラスモジュール(モジュール名:Class1) Private WithEvents App As Application Private OldBook As String Private Sub Class_Initialize() Set App = Application End Sub Private Sub App_WorkbookDeactivate(ByVal Wb As Excel.Workbook) OldBook = Wb.Name End Sub Public Property Get Name() As String Name = OldBook End Property