
マクロ初心者です。(エクセル2003使用-ユーザーフォーム)
先日はお世話になり、ありがとうございました。
作成していくうちにさらに改良を加えたく、再質問させていただきます。
※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。
が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。
すみませんが、お力をお貸しください。
(Sheet1)
担当課客先管理番号品名注文数量出荷数量
A岡田さん1324りんご3020
B山田さん1554みかん25070
C岡田さん7634なし4025
B金子さん4653みかん7570
A金子さん6675りんご17060
C杉浦さん7789りんご200120
(↓こちらは、前回質問させていただいた内容です。)
Private Sub UserForm_Initialize()
ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。
ComboBox1.ListIndex = -1
ComboBox1.SetFocus
End Sub
Private Sub CommandButton1_Click()
Dim lRow As Long
With Worksheets("Sheet2")
lRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & lRow + 1).Value = ComboBox1.Value
End With
End Sub
(↓こちらは、リストボックスでのマクロですが、動きません)
Private Sub UserForm_Initialize()
With UserForm2.ListBox1
.ColumnWidths = "70;50;50"
.ColumnCount = 3
End With
With Worksheets("Sheet1")
Dim MyA As Variant
Dim i As Long
For i = 2 To UBound(MyA, 1)
.AddItem
.List(i - 2, 0) = Cells(i, 1).Value
.List(i - 2, 1) = Cells(i, 2).Value
.List(i - 2, 2) = Cells(i, 3).Value
Next
End With
End Sub
Private Sub CommandButton1_Click()
Dim lRow As Long
With Worksheets("Sheet2")
lRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & lRow + 1).Value = ListBox1.Value
End With
End Sub
教えていただけましたら幸いです。
よろしくお願いいたします。
No.1ベストアンサー
- 回答日時:
Private Sub UserForm_Initialize() からF8を押しながらステップ実行させていけば、どこでエラーになるか分かります。
デバッグの基本なので覚えておくと良いでしょう。ちなみに、ご提示されたコードでは
For i = 2 To UBound(MyA, 1)
でとまります。理由は、MyAが何も代入されないままUBoundに使われているためです。そもそもこのMyAがなぜ出てきたのか不思議ですが…。
また、ここを訂正してもそのあとの
.AddItem
でこけます。WithでくくられているのはWorksheets("Sheet1")ですが、ワークシートにAddItemメソッドはありません。当然ならがそのあとの.Listもすべて×。逆に、Cellsは「.」が抜けているのでSheet1ではなく表示しているシートを参照することになります。
.Range("A" & lRow + 1).Value = ListBox1.Value
についても、複数行のデータはValueでは取得できません。セットするときに List(#, #)=~ としたようにListプロパティでひとつずつ取得します。
> ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。
後半のコードと見比べてみましたか?
With UserForm2.ListBox1
.ColumnWidths = "70;50;50"
.ColumnCount = 3
End With
このようにリストボックスの各カラムの幅とカラム数を指定してます。前半のコードで複数行表示ができないのは、これをしていないためです。
以上を踏まえて修正したものです。
Private Sub UserForm_Initialize()
With ListBox1
.ColumnWidths = "70;50;50"
.ColumnCount = 3
.RowSource = "Sheet1!A2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row
End With
End Sub
Private Sub CommandButton1_Click()
Dim lRow As Long
With Worksheets("Sheet2")
lRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 0)
.Range("B" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 1)
.Range("C" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2)
End With
End Sub
コンボボックスの場合は、フォームにComboBox1を設置し、コードのListBox1を全てComboBox1に置き換えてください。ただし、ドロップダウンリストは複数行で表示されますが、コンボボックス自体は複数行表示できないようなので担当課の値しか出てきません。
この回答への補足
丁寧なご回答、本当にありがとうございます。
■F8を押しながらステップ実行も知らなかったので、これからは違うと出る理由は何かを考えながら作業しようと思いました。
■ComboBoxでも作動することができました。
(ドロップダウンリストはインストールしてないためできませんでした)
コードを見ていて思ったのですが、
ComboBoxで表示した値を取得することは可能なのでしょうか?
たとえば、ComboBoxのリストで、管理番号7634を表示していた場合、その値を取得(C4であることを認識すること)し、Sheet2のセルAに7634(C4)を表示、セルBに岡田さん(B4)を表示するという方法です。
(Sheet1)
担当課 客先 管理番号 品名 注文数量 出荷数量
A 岡田さん 1324 りんご 30 20
B 山田さん 1554 みかん 250 70
C 岡田さん 7634 なし 40 25
B 金子さん 4653 みかん 75 70
A 金子さん 6675 りんご 170 60
C 杉浦さん 7789 りんご 200 120
すみませんが、今一度お付き合い願いますよう、よろしくお願いいたします。
※もしこの質問は別でした方がよろしければ、そうさせていただきます。
No.2
- 回答日時:
シートにあるデータが質問に書かれているデータだけなら
Private Sub UserForm_Initialize()
dim r as Range
' シートからデータ範囲を取得
set r = Worksheets("Sheet1").Range("A1").CurrentRegion.Offset(1)
set r = r.Resize( r.rows.count -1 )
With UserForm2.ListBox1
.ColumnWidths = "70;50;50"
.ColumnCount = 3
.RowSource = r.Address(0,0)
End With
End Sub
Private Sub CommandButton1_Click()
Dim r as Range, n as Integer
With Worksheets("Sheet2")
' 転記先のセルの取得
set r = .Range("A" & Rows.Count).End(xlUp)
for n = 1 to 3
' データの転記
r.value = ListBox1.List( listBox1.ListIndex, n )
' 右隣のセルを指定
Set r = r.Offset( , 1 )
next
End With
End Sub
といった具合でどうでしょう
皆様、ご丁寧な回答をありがとうございます。
書いていただいたコードが分かり、自分で使えるようになるには、まだ時間がかかりそうです。
が、ひとつひとつ理解していきたいと思います。
ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォームに2つのコンボボックス銀行名「ConboBox1」支店名を「ConboBox2」とし 4 2022/08/03 17:34
- Visual Basic(VBA) VBA リスト表示していますが 3 2023/05/18 12:12
- Visual Basic(VBA) Sheet「状況」から、分類の年齢別カウント数をSheet「D表」へ転記する下記マクロを作っています 7 2022/12/14 17:57
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBAコードが作動せず、どこに問題があるのか教えて下さい。 3 2023/06/13 13:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
【VBA】写真の貼り付けコードが...
-
【VBA】【ユーザーフォーム_Lis...
-
Excelで空白セル直前のセルデー...
-
VBA:日付を配列に入れ別セルに...
-
データグリッドビューの結合セ...
-
Excel UserForm の表示位置
-
DataGridViewのフォーカス遷移...
-
特定の色のついたセルを削除
-
C# DataGridViewで複数選択した...
-
【ExcelVBA】値を変更しながら...
-
【Excel VBA】一番右端セルまで...
-
EXCEL VBA 文中の書式ごと複写...
-
エクセルVBA 配列からセルに「...
-
Excel VBA 同じ処理を複数回行...
-
Excel 範囲指定スクショについ...
-
Rangeの範囲指定限界
-
EXCELのフォーム上でリアルタイ...
-
エクセル マクロ データの転記
-
エクセルVBA 郵便番号の書式判...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excel UserForm の表示位置
-
特定の色のついたセルを削除
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
VBA:日付を配列に入れ別セルに...
-
複数指定セルの可視セルのみを...
-
C# DataGridViewで複数選択した...
-
【Excel VBA】マクロで書き込ん...
-
データグリッドビューの結合セ...
-
DataGridViewのフォーカス遷移...
-
Excel 範囲指定スクショについ...
-
【Excel VBA】一番右端セルまで...
-
EXCEL VBA 文中の書式ごと複写...
-
【VBA】写真の貼り付けコードが...
-
QRコード作成マクロについて
-
入力規則のリスト選択
-
CellEnterイベント仕様について
-
エクセル、マクロで番号を読込...
おすすめ情報