• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA ステートメントをまとめたい)

VBA ステートメントのまとめ方

このQ&Aのポイント
  • VBA ステートメントをまとめる方法について教えてください。
  • ComboBoxが20まであるときに、withの中をまとめる方法を教えてください。
  • OSはXP、Excelは2003を使用しています。

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

  • ベストアンサー
  • mar00
  • ベストアンサー率36% (158/430)
回答No.1

日付から未定まではテキストボックスがバラバラなので、セルだけ共通にしています。 For j = 1 To 2 If Controls("ComboBox" & j) <> "" Then If j = 1 Then myNumber = 10 ElseIf j = 2 Then myNumber = 30 End If .Cells(i + j, 1) = TextBox1.Value '日付 .Cells(i + j, 2) = TextBox2.Value '伝票No. .Cells(i + j, 24) = TextBox3.Value '郵便番号 .Cells(i + j, 25) = TextBox4.Value '住所 .Cells(i + j, 3) = TextBox5.Value '社名 .Cells(i + j, 4) = TextBox6.Value '担当者名 .Cells(i + j, 18) = TextBox601.Value '税抜合計 .Cells(i + j, 19) = TextBox602.Value '消費税 .Cells(i + j, 20) = TextBox603.Value '合計 .Cells(i + j, 22) = TextBox701.Value '備考 .Cells(i + j, 23) = TextBox702.Value '未定 .Cells(i + j, 6) = Controls("ComboBox" & j).Value '商品コード For k = 1 To 12 If k < 12 Then .Cells(i + j, k + 6) = Controls("TextBox" & k + myNumber).Value 'メーカー名から小計 Else .Cells(i + j, k + 9) = Controls("TextBox" & k + myNumber).Value '社内コメント End If Next k End If Next j 動作確認はしていませんのでブックをコピーするなどしてから確認して下さい。

6338-tm
質問者

お礼

確認が遅くなってしまってごめんなさい。 書いて下さったステートメントで、まとめる前と同じ様に出来ました。 これをComboBox20まで対応させれば、すごくステートメントがまとめられるし、見やすくなります。 本当にありがとうございました。

その他の回答 (1)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

ワークシートに対照表を作成しておいて、フォーム生成の際に読み込むのはいかがでしょうか。手直しが楽だと思います。 書き出し時に、ワークシートを読みに行っても良いのですが、思いつきで構造体に取り込んでみました。 対照表は添付画像の様な姿で、起点セルからのオフセットを入れておきます。(あくまで例なので、ご質問のセル配置とは異なっています) Private Type controlInfo controlName As String rowOffset As Long columnOffset As Long End Type Dim myControls() As controlInfo Private Sub UserForm_Initialize() Dim controlInfoRange As Range Dim i As Long Set controlInfoRange = ThisWorkbook.Worksheets(1).Range("A1").CurrentRegion ReDim myControls(1 To controlInfoRange.Rows.Count) For i = 1 To UBound(myControls) With myControls(i) .controlName = controlInfoRange(i, 1) .rowOffset = controlInfoRange(i, 2) .columnOffset = controlInfoRange(i, 3) End With Next i End Sub Private Sub CommandButton1_Click() Dim sh As Worksheet, myRange As Range Dim i As Long Set sh = ThisWorkbook.Worksheets(2) Set myRange = sh.Range("A1") For i = 1 To UBound(myControls) With myControls(i) myRange.Offset(.rowOffset, .columnOffset).Value = Me.Controls(.controlName).Value End With Next i Unload Me End Sub ☆下記はおまけ。標準モジュールに記述してください。 フォームのコントロールの名前のリストをワークシートに出力します。 Sub test() Dim myControl As Control Dim destRange As Range Set destRange = ThisWorkbook.Worksheets(1).Range("A1") Load UserForm1 For Each myControl In UserForm1.Controls destRange.Value = myControl.Name Set destRange = destRange.Offset(1, 0) Next myControl Unload UserForm1 End Sub

6338-tm
質問者

お礼

mitarashiさんの書いて下さったステートメントを自分のに置き換えてみようとしたのですが、今まで使ったことのないものばかりで、うまく置き換える事が出来ませんでした。 もう少し考えて置き換えてみます。ごめんなさい。 おまけで書いて下さった標準モジュールの方、すごく有り難いです。 手書きで書き出してたので、これが出来ると手間がかなり省けます。 本当にありがとうございました。

関連するQ&A