解説:VBAコードの理解が難しいListBox2の選択行を表示する方法

このQ&Aのポイント
  • ListCountを-1する理由とは?
  • ListBox2の選択行を表示するためのVBAコードの解説
  • 改行の必要性とは?
回答を見る
  • ベストアンサー

ListCount -1等

CommandButtonのコードです。 ListBox2で選択された行を、MsgBoxで表示する様です。 コードの理解が難しく、お助け頂けませんか。 プログラミングもPCもド素人ですのでご了承下さい。。。 Dim i As Integer Dim ah As Integer Dim ms As String ah = ListBox2.ListCount -1※1 For i = 0 To ah If ListBox2.Selected(i) = True Then ms = ms & (i + 1)※2 & vbCrLf※3 Next i MsgBox ms ※1 -1を消すとエラーになるのは何故。 減算の理由は0からカウントされるからだと有るが、最大行数は最大行数ままの数が表示されるので、無くても良い様に見えます。0からカウントとはどういう事なのか。 ※2 ()は書くべきですか。 ※3 何故、改行が必要なのでしょう。 参照ページでも歓迎です。宜しくお願いします。

noname#233045
noname#233045

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

  • ベストアンサー
  • HohoPapa
  • ベストアンサー率65% (454/691)
回答No.1

>※1 -1を消すとエラーになるのは何故。 >減算の理由は0からカウントされるからだと有るが、 >最大行数は最大行数ままの数が表示されるので、 >無くても良い様に見えます。 >0からカウントとはどういう事なのか。 ListBox2.ListCount ↑は、ListBoxに何行あるかを求めています。 5行あれば、当然ですが、5になります。 他方 ListBox2.Selected(i) のiは、 ListBox2に表示された行の1行目からの番号(index)で 1行目が0、2行目が1、.....5行目が4です。 5行あるそれぞれの行を 先頭行から1行ごとに選択されているかどうかを調べるコードですから、 開始が0、最後が4です。 >※2 ()は書くべきですか。 選択されている行の番号を求めているわけですが、コードの作者は 1行目なら1、2行目なら2、.....5行目なら5を表示したいので 1を足しています。 (i + 1) これは、数の足し算です。 ms & (i + 1) この行の&は、文字列の結合です。 都合、()は省略できません。 >※3 何故、改行が必要なのでしょう。 vbCrLfを除いて実行してみるとわかると思います。 例えば、ListBoxに5行あって、3行目と5行目が選択されている場合 vbCrLfがないと、 35 ↑のメッセージが表示され vbCrLfがあると、 3 5 ↑のメッセージが表示されます。 ですので、 Dim i As Integer Dim ah As Integer Dim ms As String ah = ListBox2.ListCount For i = 1 To ah  If ListBox2.Selected(i-1) = True Then  ms = ms & i & vbCrLf Next i MsgBox ms というコードでも結果は同じです。 なお、上記コードでも正しく動作しますが、 より正しいコードは、 Dim i As Integer Dim ah As Integer Dim ms As String ah = ListBox2.ListCount For i = 1 To ah  If ListBox2.Selected(i-1) = True Then  ms = ms & format(i,"0") & vbCrLf Next i MsgBox ms です。 つまり、 文字列を結合するときに、 数値は予め文字列に変換します。

noname#233045
質問者

お礼

丁寧なご回答に感謝します。全て、理解出来ました。

関連するQ&A

  • VBA 乱数と配列

    VBA 乱数と配列 配列(0)~配列(5)の一次元配列の中に、1から6までの数字を重複しないように入れたいのですが、 上手くいきません。 ご指導の程、お願いします。 Sub rndsys() Dim 配列(5) As Integer Dim サイコロ As Integer Dim カウントA As Integer Dim カウントB As Integer Dim フラグ As Integer For カウントA = 0 To 5 Do サイコロ = Int(Rnd(1) * 6) + 1 For カウントB = 0 To 5 If 配列(カウントB) = サイコロ Then フラグ = フラグ + 1 End If Next カウントB Loop Until フラグ > 0 配列(カウントA) = サイコロ Next カウントA MsgBox 配列(0) & vbCrLf & 配列(1) & vbCrLf & 配列(2) & vbCrLf & 配列(3) & vbCrLf & 配列(4) & vbCrLf & 配列(5) End Sub

  • Excel VBA リストボックスについて

    現在エクセルのVBAを勉強中の 超初心者なのですが、 リストボックスを使うコードでエラーが出て どう直したらいいかわかりません。 下記コードをどのようになおしたらいいでしょうか? 回答、よろしくお願いいたします。 エラー内容は、実行時エラー381 Listプロパティを設定できません。プロパティの配列のインデックスが無効です。 Private Sub UserForm_Initialize() 'リストボックスの設定 With ListBox1 .Font.Size = 10 .ColumnCount = 7 .ColumnWidths = "50;100;80;80;100;30;70" .TextAlign = fmTextAlignLeft .Font.Name = "MSゴシック" End With Dim i As Integer Dim LastRow As Integer LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 2 To LastRow With ListBox1 .AddItem Cells(i, 1).Value .List(ListCount - 1, 1) = Cells(i, 2).Value .List(ListCount - 1, 2) = Cells(i, 3).Value ←ここでエラー .List(ListCount - 1, 3) = Cells(i, 4).Value .List(ListCount - 1, 4) = Cells(i, 5).Value .List(ListCount - 1, 5) = Cells(i, 6).Value .List(ListCount - 1, 6) = Cells(i, 7).Value End With Next End Sub

  • Excel VBA ListBoxの行数取得の件

    OSは、XP Excelは、2003 を使用しています。 ユーザーフォームで、ListBoxの行数取得のところが上手く行かずに困っています。 ************** Private Sub btnSalesDelete_Click() 'lstinfoにおいて、どの行も選択されていなければ、終了 If lstInfo.ListIndex = -1 Then Exit Sub Dim res As Integer Dim Msg As String, Title As String Msg = "伝票番号:" & lstInfo.Value & " を削除します。よろしいですか?" Title = "確認" res = MsgBox(Msg, vbYesNo + vbExclamation + vbDefaultButton2, Title) If res = vbNo Then Exit Sub 'シート「売上基本情報」の該当行の「削除」列に1を代入 Dim TargetRow As Integer TargetRow = lstInfo.Value + 1 Worksheets("売上基本情報").Cells(TargetRow, 5).Value = 1 'シート「売上明細」の該当行の「削除」列に1を代入 Dim c As Integer c = lstInfoMeisai.ListCount '明細行の行数をcに代入 Dim i As Integer Dim r As Integer For i = 0 To c - 1 r = lstInfoMeisai.List(i, 0) '←←←ここで実行エラー13 型が一致しません になります。 Worksheets("売上明細").Cells(r + 1, 15).Value = 1 Next 'lstinfoから、行を削除 lstInfo.RemoveItem lstInfo.ListIndex 'lstinfomeisaiのリストをクリア lstInfoMeisai.Clear End Sub ***************** 上記で実行すると、lstInfoのListCountと同じ数字を、lstInfoMeisaiの方にも代入されます。 実際、lstInfoMeisaiのListCountが 12、lstInfoのListCountが 3 の場合、 rが4になった時、実際にはそのListCountにがデータがないので、””を返してしまい、 実行エラー13 型が一致しません とデバックになってしまいます。 説明が上手くなくて申し訳ありませんが、どなたか修正の仕方を教えていただけないでしょうか? よろしくお願い致します。

  • テキストボックス空欄への追加入力

    リストボックス1であ行の氏名項目を選択実行しテキストボックス1~8に入力された後にか行にリストボックス項目を変え氏名を選択実行した場合、下記のコードではテキストボックス1からまた上書きされる。テキストボックス空欄に続けて選択項目が入力される方法はあるのでしょうか。悩んでいます。どなたかコードがわかる方よろしくお願いします。 Private Sub 実行Cnd_Click() Dim cnt As Integer   Dim i As Integer If ListBox1.ListIndex = -1 Then Exit Sub cnt = 1 For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) Then Me.Controls("TextBox" & cnt).Text = ListBox1.List(i) cnt = cnt + 1 End If Next End Sub

  • ListBoxのデータを高速でファイルに書き込む方法 VB.NET

    ListBoxに大量のデータを登録してありそれをファイルに保存する場合 Dim data As String For i As Integer = 0 To ListBox1.Items.Count - 1 data = data & ListBox1.Items(i) & VbCrLf Next という方法で変数に読み込むとデータが大量にある場合 非常に遅く、OutOfMemoryのエラーが出てしまったりするのですが、 このような場合により適切な方法がありましたらご教授頂けないでしょうか。 宜しくお願いいたします。

  • Listプロパティについて

    お世話になります。 自分で作ったコードではないので、訂正していたらよくわからなく なってしまいました。 これはsheet1からsheet2にリストボックスから転記するように なっています。MyCol = Arrayの部分を変更したのですが、 参考書で調べてみたのですが、理解出来なかったので、質問しました。 ListIndex8までを転記していることはわかりました。 その後、ListIndexを11列周期で値をMyBufに代入したいと考えています。(言葉が適当なのかはわかりません) 下記の部分を変更すればよいと思うのですが、まずはコードの 意味を理解したいと思うので、このコードの意味をわかりやすく 解説してもらえませんでしょうか? MyBuf(i, 0) = .List(N, i * 9 + j + 8) Next Range(MyCol(j) & "21:" & MyCol(j) & "42").Value = MyBuf 以下コード Range("AP4").Value = ListBox1.List(ListBox1.ListIndex, 0) Range("AN3").Value = ListBox1.List(ListBox1.ListIndex, 1) Range("AQ3").Value = ListBox1.List(ListBox1.ListIndex, 2) Range("C3").Value = ListBox1.List(ListBox1.ListIndex, 3) Range("C6").Value = ListBox1.List(ListBox1.ListIndex, 4) Range("AH14").Value = ListBox1.List(ListBox1.ListIndex, 5) Range("AM54").Value = ListBox1.List(ListBox1.ListIndex, 7) Range("AH15").Value = ListBox1.List(ListBox1.ListIndex, 251) Range("AH16").Value = ListBox1.List(ListBox1.ListIndex, 252) Range("AH17").Value = ListBox1.List(ListBox1.ListIndex, 253) Range("AH18").Value = ListBox1.List(ListBox1.ListIndex, 254) Dim i As Integer, j As Integer, N As Integer, MyBuf(21, 0), MyCol MyCol = Array("B", "F", "K", "L", "Z", "AB", "AD", "AH", "AK", "AM", "AS") With ListBox1 N = .ListIndex For j = 0 To 8 If j <> 7 Then For i = 0 To 21 MyBuf(i, 0) = .List(N, i * 9 + j + 8) Next Range(MyCol(j) & "21:" & MyCol(j) & "42").Value = MyBuf End If Next End With Exit Sub

  • ListBox内の並び替えで実行エラー

    OSはXP、 Excelは2003を使用しています。 ユーザーフォーム内のListBox内で、コマンドボタンをクリックして行を上や下に並び替えたく、 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1041407835 を参考にして、下記の通りに組んだのですが、 下に並び替えるCommandButton2を実行時や、 上に並び替えるCommandButton1を「2回目」に実行時に 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 となってしまいます。 Private Sub CommandButton1_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ上げる。 i = Me.ListBox1.ListIndex If i > 0 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i - 1, j) Me.ListBox1.List(i - 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i - 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i - 1, k) Me.ListBox2.List(i - 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i - 1) = True Next k Next j End If End Sub Private Sub CommandButton2_Click() Dim i As Variant Dim j As Integer Dim k As Integer Dim myBuf1 As Variant Dim myBuf2 As Variant ' 選択されている項目を1つ下げる。 i = Me.ListBox1.ListIndex If i < Me.ListBox1.ListCount - 1 Then For j = 1 To 7 myBuf1 = Me.ListBox1.List(i + 1, j) Me.ListBox1.List(i + 1, j) = Me.ListBox1.List(i, j) Me.ListBox1.List(i, j) = myBuf1 Me.ListBox1.Selected(i + 1) = True For k = 0 To 6 myBuf2 = Me.ListBox2.List(i + 1, k) Me.ListBox2.List(i + 1, k) = Me.ListBox2.List(i, k) Me.ListBox2.List(i, k) = myBuf2 Me.ListBox2.Selected(i + 1) = True Next k Next j End If End Sub 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

  • VBA リストボックスの値をセルに転記

    よろしくお願いします。 したいことは、 ユーザーフォームのリストボックスで複数の値を選んで複数セルに転記する。 ActiveCell.offset(10, 5) ⇐ リストボックスで選んだ1つ目 ActiveCell.offset(11, 5) ⇐ リストボックスで選んだ2つ目 ActiveCell.offset(12, 5) ⇐ リストボックスで選んだ3つ目 下の構文では1つしか転記できません。 Dim n As Integer, s As String For n = 0 To ListBox3.ListCount - 1 If ListBox3.Selected(n) Then s = s & ListBox3.List(n) & vbCrLf ActiveCell.offset(10, 5).Value = s End If Next

  • リストボックスからの入力をテキストに貼付

    下記コードではリストボックあ行選択しテキスト1~6に入力後、クリアボタンで消去したあと、か行選択しテキストに入力したら7~貼付けになるクリアボタンで消去後、改めてテキスト1~入力するコードがありますか。どなたか解る方よろしくお願いします。 Private Sub 実行_Click() Static cnt As Integer Dim i As Integer If Listbox.ListIndex = -1 Then Exit Sub For i = 0 To Listbox.ListCount - 1 If Listbox.Selected(i) Then cnt = cnt + 1 If cnt > 10 Then cnt = 1 Me.Controls("TextBox" & cnt).Text = Listbox.List(i) End If Next End Sub Private Sub クリア_Click() Dim tbCont As Control With Me.MultiPage1 For Each tbCont In .Pages(.Value).Controls If TypeName(tbCont) = "TextBox" Then tbCont.Value = Null End If Next tbCont End With End Sub

  • 「1から5の間なら」とするには?

    「1から5の間なら」とするには? エクセルvbaです。 Sub test1() Dim i As Integer i = 1 If i = 1 Or i = 2 Or i = 3 Or i = 4 Or i = 5 Then MsgBox "1-5までのどれかです" End If End Sub は、最大でも5なので手入力でできますが、 これが1から100までならor演算子で繋ぐのは大変なので Sub test2() Dim i As Integer i = 1 If i = [1-5] Then MsgBox "1-5までのどれかです" End If End Sub みたいなことをやりたいのですが、うまくいきません。 デバッグしてもエラーにもなりません。 自分でコードを書いといて聞くのもおかしいですがtest2の意味と、表題の方法を教えてください。 よろしくお願いします。

専門家に質問してみよう