Visual Basic 6.0でのステートメントの簡略方法(ループ)について

このQ&Aのポイント
  • Visual Basic 6.0でFor/Doを使ってオブジェクト名を省略する方法について教えてください。
  • フォームロード時に各セルの値をCommandButtonのオブジェクト名に割り当てる方法を教えてください。
  • CB1の部分を動的に変更する方法があれば教えてください。
回答を見る
  • ベストアンサー

ステートメントの簡略方法(ループ)

Visual Basic 6.0 For/Doを使って省略可させようと考えているのですが、オブジェクト名は ループさせて省略可出来ないのでしょうか? 下記はフォームロード時に各セルの値を各CommandButton名に割り当てています。(一部分です) (例) CB○はCommandButtonのオブジェクト名です。 Form2.CB1.Caption = Trim(xlSheet.Cells(11, 3)) Form2.CB2.Caption = Trim(xlSheet.Cells(12, 3)) Form2.CB3.Caption = Trim(xlSheet.Cells(13, 3)) Form2.CB4.Caption = Trim(xlSheet.Cells(14, 3)) Form2.CB5.Caption = Trim(xlSheet.Cells(15, 3)) ・ ・ ・  ↓ Dim SUU As Integer Dim i As Integer SUU = 0 For i = 1 To 20 Step 1 SUU = SUU + 1 Form2.CB1.Caption = Trim(xlSheet.Cells(10 + SUU, 3)) Next i CB1の部分を "CB" & SUU の様にしたいのですが、エラーしてしまいます。 省略可の方法が有りましたら教えて下さい。

  • mmac
  • お礼率94% (64/68)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>"CB" & SUU の様にしたいの だと、文字列になるのでオブジェクトを指していないので当然です。 From2.Controls("CB" & SUU).Caption の様にコントロール名から対象となるコントロールを取得することで可能です。 参考 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard20.htm また、コントロール配列が可能であれば、再考してみてください。

mmac
質問者

お礼

すみません、コントロール配列を理解していませんでした。 ボタンやテキストボックスをコピー&貼付けでコントロール配列させ 上記方法で、省略可出来ました。 有難う御座いました。

mmac
質問者

補足

回答有難う御座います。 From2.Controls("CB" & SUU).Caption を試したのですが、その箇所でエラーしてしまいます。 実行時エラー'424'; オブジェクトが必要です。 Form1からForm2を操作しているからでしょうか? 下記はDimのSUUを省きました。 Private Sub Command3_Click()  Dim xlApp As Object  Dim xlBook As Object  Dim xlSheet As Object  Dim i As Integer  Set xlApp = CreateObject("Excel.Application")  Set xlBook = xlApp.Workbooks.Open("C:\Link一覧.xls")  xlApp.Visible = False  Set xlSheet = xlBook.Worksheets("Sheet1")  Form2.Label1.Caption = Trim(xlSheet.Cells(11, 2))  For i = 1 To 20 Step 1 '(CommandButton CB1~CB20まで)   From2.Controls("CB" & i).Caption = Trim(xlSheet.Cells(10 + i, 3))  Next i  xlBook.Close (True)  xlApp.Quit  Set xlApp = Nothing End Sub

関連するQ&A

  • EXCELの列複数削除

    VB6.0で開発しています。 下のようにEXCELの列を複数削除していますが 思うように削除されません。 削除はされるのですが B列を削除してから次C列を削除となってしまっているので C列を削除する時は元々のC列ではなく B列を削除してからのC列を削除してしまいます。 どう直せばいいのでしょうか? お願いします。 Private Sub Command2_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim B As Integer Dim C As Integer Dim D1 As Integer Dim E As Integer Dim G As Integer Dim H As Integer Dim K As Integer Dim L As Integer Dim M As Integer Dim N As Integer Dim P As Integer Dim R As Integer Dim T As Integer Dim U As Integer Dim V As Integer Dim Y As Integer Dim Z As Integer Dim AA As Integer Dim AB As Integer Dim AC As Integer Dim AD As Integer Dim AE As Integer Dim AF As Integer Dim AG As Integer Dim AH As Integer Dim AI As Integer Dim AJ As Integer Dim AL As Integer Dim AM As Integer Dim AP As Integer Dim AQ As Integer Dim AR As Integer Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("C:\Users\maki\Documents\Book1") Set xlSheet = xlBook.Worksheets("Sheet1") xlApp.Visible = True B = 2 C = 3 D1 = 4 E = 5 G = 7 H = 8 K = 11 L = 12 M = 13 N = 14 P = 16 R = 18 T = 20 U = 21 V = 22 Y = 25 Z = 26 AA = 27 AB = 28 AC = 29 AD = 30 AE = 31 AF = 32 AG = 33 AH = 34 AI = 35 AJ = 36 AL = 38 AM = 39 AP = 42 xlSheet.Cells(1, C).EntireColumn.Delete xlSheet.Cells(1, D1).EntireColumn.Delete xlSheet.Cells(1, E).EntireColumn.Delete xlSheet.Cells(1, G).EntireColumn.Delete xlSheet.Cells(1, H).EntireColumn.Delete xlSheet.Cells(1, K).EntireColumn.Delete xlSheet.Cells(1, M).EntireColumn.Delete xlSheet.Cells(1, N).EntireColumn.Delete xlSheet.Cells(1, P).EntireColumn.Delete xlSheet.Cells(1, R).EntireColumn.Delete xlSheet.Cells(1, T).EntireColumn.Delete xlSheet.Cells(1, U).EntireColumn.Delete xlSheet.Cells(1, V).EntireColumn.Delete xlSheet.Cells(1, Y).EntireColumn.Delete xlSheet.Cells(1, Z).EntireColumn.Delete xlSheet.Cells(1, AA).EntireColumn.Delete xlSheet.Cells(1, AB).EntireColumn.Delete xlSheet.Cells(1, AC).EntireColumn.Delete xlSheet.Cells(1, AD).EntireColumn.Delete xlSheet.Cells(1, AE).EntireColumn.Delete xlSheet.Cells(1, AF).EntireColumn.Delete xlSheet.Cells(1, AG).EntireColumn.Delete xlSheet.Cells(1, AH).EntireColumn.Delete xlSheet.Cells(1, AI).EntireColumn.Delete xlSheet.Cells(1, AJ).EntireColumn.Delete xlSheet.Cells(1, AL).EntireColumn.Delete xlSheet.Cells(1, AM).EntireColumn.Delete xlSheet.Cells(1, AP).EntireColumn.Delete Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing End Sub

  • VB6 Form内のDragDrop

    VB6でForm内にCommandButtonがいくつか有ります。 各CommandButtonはClickするとShellオブジェクトでファイルを開く様になっています。 やりたいことは 2つのCommandButton間をDragDrop?によりCaptionを入れ替えたいです。 (CommandButton間をマウスDragDropでCaption名入れ替え) MouseDownとDragDropイベントで何とかなると思いましたがうまくいきません。 Dim dd As Integer Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then dd = 1 'CommandボタンNo, End If End Sub Private Sub Command2_DragDrop(Source As Control, X As Single, Y As Single) Dim cn As String cn = Command2.Caption Command2.Caption = Controls("Command" & dd).Caption Controls("Command" & dd).Caption = cn End Sub CommandButtonプロパティでDragModeを自動にするとShellオブジェクトでファイルが開かないし サイトで調べたところファイルの移動やコマンド自体の移動などで分かりませんでした。 ご教授お願い致します。

  • エクセル2003(VBA)で違うフォームのチェックボックス配列を繰り返し処理したい

    エクセル2003(VBA)で違うフォームのチェックボックス配列を 元に順番に繰り返し処理したいのですが、うまくいきません。 どうかお知恵をお貸し下さい。 よろしくお願いします。 ■<ユーザーフォーム1>(本体フォーム) Private Sub CommandButton1_Click() UserForm2.Show Dim n As Integer Dim ender As Integer ender = 1 i = 1 For n = 1 To 20 If i > 4 Then i = 1 '4を超えたら1に戻る If cb(i).Value = False Then 'チェックがなかったら飛ばす i = i + 1 '次の配列へ n = n - 1 'ループ回数をカウントしないように1引く Else Worksheets("sheet1").Cells(ender, 5).Select Worksheets("sheet1").Cells(ender, 5) = "■" & cb(i).Caption & " = " & cb(i).Value ender = ender + 1 i = i + 1 End If Next n End Sub ■<ユーザーフォーム2>(チェックボックスフォーム) Private Sub CommandButton1_Click() Const cb_num = 4 'チェックボックスを4個に設定 Dim cb(cb_num) As Control Dim ctrl As Control Dim i As Integer i = 0 For Each ctrl In Me.Controls 'コントロールの数だけループする If TypeName(ctrl) = "CheckBox" Then 'タイプがチェックボックスなら i = i + 1 If i > cb_num Then Exit For 'チェックボックスの数を超えたコントロールは無視 Set cb(i) = ctrl 'コントロールを配列に代入 End If Next ctrl End Sub

  • EXCELのグラフ

    下のようにVBからExcel にデータを送りグラフを表示しています。 印刷プレビューを表示したときにグラフと表が表示されてしまいます。グラフだけを表示して表は表示をしたくないのですが どうすればいいのでしょうか お願いします。 Private Sub Command1_Click() Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets.Add Dim i As Integer Dim j As Integer For i = 2 To 6 For j = 2 To 6 xlSheet.Cells(j, i) = CInt(71 * Rnd + 30) Next j Next i xlSheet.Cells(2, 1) = "国語" xlSheet.Cells(3, 1) = "数学" xlSheet.Cells(4, 1) = "英語" xlSheet.Cells(5, 1) = "社会" xlSheet.Cells(6, 1) = "体育" xlSheet.Cells(1, 2) = "石原" xlSheet.Cells(1, 3) = "小泉" xlSheet.Cells(1, 4) = "田中" xlSheet.Cells(1, 5) = "平沼" xlSheet.Cells(1, 6) = "森山" Dim MyChart As ChartObject Set MyChart = xlSheet.ChartObjects.Add(10, 100, 600, 330) With MyChart.Chart .SetSourceData xlSheet.Range("A1:F6"), xlColumns .Axes(xlValue).MaximumScale = 100 .Axes(xlValue).MajorUnit = 20 .HasTitle = True .ChartTitle.Text = "中間テスト結果" .ApplyDataLabels (xlDataLabelsShowValue) .Location xlLocationAsObject, xlSheet.Name End With xlApp.Visible = True With xlSheet.PageSetup .PaperSize = xlPaperA4 .Orientation = xlPortrait .LeftMargin = xlApp.CentimetersToPoints(2) .RightMargin = xlApp.CentimetersToPoints(2) .TopMargin = xlApp.CentimetersToPoints(2.5) .BottomMargin = xlApp.CentimetersToPoints(2.5) .HeaderMargin = xlApp.CentimetersToPoints(1) .FooterMargin = xlApp.CentimetersToPoints(1) End With xlSheet.PrintPreview Set MyChart = Nothing Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing End Sub

  • 実行時エラー91について

    vbでエクセルにデータを入力したあと、2つのシートを選択し、 その後に両面印刷を行うプログラムを作成中ですが、 印刷の段階で 「実行時エラー91。オブジェクト変数または with ブロック変数が設定されていません。」 とのエラーがでます。 どの部分がおかしいのかわからないので教えて下さい。 Dim xlApp As Excel.Application Dim xlBook As Excel.Workbook Dim xlSheet As Excel.Worksheet Dim xlSheet2 As Excel.Worksheet Dim xlFile As String xlFile = App.Path & "表.xls" Dim MyFile As String MyFile = Dir$("表.xls") If Len(MyFile) > 1 Then Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open(xlFile) Set xlSheet = xlBook.Worksheets("裏") Set xlSheet2 = xlBook.Worksheets("表") xlApp.Visible = True a1 = Label47.Caption a1 = Format(a1, "#,#") a2 = Label48.Caption m = a1 & "及び" & a2 & "とする。" For k = 1 To 18 s = Mid(m, k, 1) i = 8 + (k - 1) * 2 xlSheet.Cells(40, i).Value = s Next k Set xlSheet2 = xlBook.Worksheets("表") xlSheet2.Cells(4, 2).Value = Text11.Text xlSheet2.Cells(4, 10).Value = Text12.Text xlSheet2.Cells(4, 19).Value = Text13.Text xlBook.Sheets(Array("表", "裏")).Select ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True ←ここでエラー Set xlApp = Nothing Set xlBook = Nothing Set xlSheet = Nothing Set xlSheet2 = Nothing

  • VBAで縦一列に数字を入力したい

    Private Sub CommandButton1_Click() Dim n As Integer Dim i As Integer Dim x As Integer For i = 1 To n x = i + 3 n = InputBox("層数の値を入力してください") Cells(3, 1).Value = ("基板") Cells(x, 1).Value = i x = x + 1 Next End Sub 上記のようなマクロを組んだのですが、4行目に1が入ってとまってしまいました。 これを完成させるにはどうしたらいいでしょうか?

  • コマンドボタン名の設定で

    お世話になります。 現在EXCELシート上に複数のコマンドボタンを置き、 そのコマンドボタン名をセルの値からとってこようとしています。 これがVBの考えでしたら ************************************************* Dim i as integer 'ループ用変数 '対象セルに値が存在しなくなるまでループ Do While Worksheets("Sheet1").Cells(i, 1) <> "" 'セルの値をコマンドボタン名に代入 Worksheets("Sheet1").CommandButton(i).Caption = Worksheets("Sheet1").Cells(i, 1).Value i = i + 1 Loop ************************************************* のようにできるのではないかと考え、いろいろと試行錯誤しているのですがうまくいきません。 VBAではこのようなやり方はできないのでしょうか? vbのように変数名でループさせるということは出来ないというような情報もあるのですが、出来ればこの考えに似たような感じのプログラムの組み方がしたいと考えております。 どなたかご教授よろしくお願いいたします。

  • エクセルマクロに関する質問

    最近、エクセルマクロを始めてたのですが、下記のような状態で困っています。 プログラムを実行した際に、Cells((I1 + I5), I6)のセルに計算式がはいって欲しいのですが、 現状では計算結果が入るだけになってしまっています。 また、単純に文字列に変換してしまうだけだと、変数が邪魔になって式になってくれません。 誰かお分かりになる方がいましたら、教えてください。  Dim I1 As Integer Dim I2 As Integer Dim I3 As Integer Dim I4 As Integer Dim I5 As Integer Dim I6 As Integer Dim I7 As Integer Dim I8 As Integer Cells((I1 + I5), I6) = Cells((I1 + I5) - 2, I6) + Cells((I1 + I5), I6 - 2) - Cells(I1 + I5, I6 - 1)

  • ACCESSからEXCELに出力する際、時間がかかる。

    よろしくお願いします。 ACCESS VBA を使用して、既存のEXCELファイルにデータを出力しているのですが、すごく時間がかかってしまいます。件数が少ない時はそれほど気にならないのですが。時間短縮する方法を教えてください。 Sub S_ExportExcel_ADO() Dim CN As ADODB.Connection Dim rst As ADODB.Recordset Dim objExcel As Excel.Application Dim i As Integer Dim W_SQL As String On Error GoTo Err_S_ExportExcel_ADO Set objExcel = New Excel.Application objExcel.Workbooks.Open ("test.xls") objExcel.Worksheets("sheet1").Select Set CN = CurrentProject.Connection Set rst = New ADODB.Recordset W_SQL = "SELECT * FROM データ" rst.Open W_SQL, CN, adOpenKeyset, adLockReadOnly i = 1 Do Until rst.EOF objExcel.Cells(i, 4) = Trim("" & rst![データ1]) objExcel.Cells(i, 5) = Trim("" & rst![データ2]) objExcel.Cells(i, 6) = Trim("" & rst![データ3]) objExcel.Cells(i, 7) = Trim("" & rst![データ4]) objExcel.Cells(i, 9) = Trim("" & rst![データ5]) '***省略*** objExcel.Cells(i, 35) = Trim("" & rst![データ15]) objExcel.Cells(i, 36) = Trim("" & rst![データ16]) i = i + 1 rst.MoveNext Loop 'EXCEL保存 objExcel.ActiveWorkbook.Close objExcel.Quit rst.Close CN.Close Set rst = Nothing Set CN = Nothing Set objExcel = Nothing End Sub

  • オブジェクト名を変数で参照できますか

    VB初心者です。 配列の場合 Dim str(10) as string と宣言し、i番目のデータを取り出したいときには、str(i) と記述すると思います。 そこで質問ですが、例えばCommandが1~10まであるとします。 オブジェクト名はそのまま(Command1, Command2)で、それぞれのCaptionに違ったデータが入っています。 (例えば、Command1のCaptionには'A' Command2のCaptionには'B'といった感じに) ある文字列があり、For文を使い、CommandのCaptionとその文字列が一致したときに文字列を出力するという処理を行いたいとき、どのように Command1~10のCaptionを回せばいいのでしょうか? コードを記述しておきます。 Dim str(10) as String Dim i as Integer Dim j as Integer for i = 0 to 10 for j = 0 to 10 ☆☆ if Command(i).Caption = str(j) then print.str(j) end if next next ☆☆のところです。 可能であれば回答をお待ちしております。 環境は windows XP, VB6.0 です。

専門家に質問してみよう