
マクロ初心者です。(エクセル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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel UserForm の表示位置
-
Rangeの範囲指定限界
-
VBAマクロ実行時エラーの修正に...
-
入力規則のリスト選択
-
Excelで空白セル直前のセルデー...
-
PasteSpecial Paste:=[********...
-
下記のマクロの説明(意味)を...
-
オーバーフローを回避する方法?
-
C# DataGridViewで複数選択した...
-
【Excel VBA】一番右端セルまで...
-
数式バーに表示される値(文字...
-
SPREAD.netで選択セルの合計を...
-
エクセルVBA ダブルクリックし...
-
エクセルVBA 配列からセルに「...
-
DataGridViewのフォーカス遷移...
-
Excel VBA 同じ処理を複数回行...
-
VB6.0からExcel結合セルへ書出...
-
エクセル関数のことで質問です...
-
円弧の描画方法
-
VBA:日付を配列に入れ別セルに...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
特定の色のついたセルを削除
-
C# DataGridViewで複数選択した...
-
【VBA】【ユーザーフォーム_Lis...
-
データグリッドビューの結合セ...
-
【VBA】写真の貼り付けコードが...
-
VBA:日付を配列に入れ別セルに...
-
入力規則のリスト選択
-
セルの半透明着色処理
-
EXCEL VBA 文中の書式ごと複写...
-
Excel VBAでCheckboxの名前を変...
-
【ExcelVBA】値を変更しながら...
-
【Excel VBA】一番右端セルまで...
-
エクセルのカーソルを非表示に...
-
DataGridViewのフォーカス遷移...
-
DataGridViewでグリッド内に線...
-
Excel VBA でFunctionプロシジ...
おすすめ情報