• 締切済み

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 説明不足や上記の記述にとんちんかんな間違いがありましたら、ごめんなさい。 どなたか解決方法を教えて頂けますようお願い致します。

みんなの回答

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.2

こんにちは。#1、cjです。 ちょっと具合悪くてお休みしてました。遅くなってすみません。 #1お礼欄、確認しました。 残念ながら、エラーの原因を特定するには至りませんでしたが、 #1のコードが【原因】でエラーが出るとは考えにくいので、  【原因】は他にある。#1のコードは【きっかけ】に過ぎない。 ということは言えそうです。 そうなると、これまでに提示された情報に含まれない部分が エラーの【原因】ということになるかと思います。 比較的可能性が高いと思われるのは、 同一のUserFormモジュールに  Private Sub ListBox2_Change()  Private Sub ListBox2_Click() などがあって、そちらが悪さしている場合です。   .List(nTgIdx - 1, i) = .List(nTgIdx, i) の行では、_Changeイベント、   .Selected(nTgIdx - 1) = True の行では、_Changeイベントと_Clickイベントが呼び出されます。 もし、これらのイベントプロシージャがある場合は、 一旦、それらをコメントブロックしてから試行して、 結果に違いが出るか確認してみましょう。 それで解決が見えて来たなら以下は読まなくてもいいですが、 依然解決できない場合は以下、、、。 さて、どうやって【原因】を特定するか、という話を書いてみます。 因みに、私自身は、  「実行時エラー -2147417848(80010108)   オートメーションエラーです。  起動されたオブジェクトはクライアントから切断されました。」 というエラーの経験はあります。 しかし、UserFormとWorksheetだけで、この手のエラーを見たことはありません。 (経験したのはADOとかWebBrowserとかMSWordなどの外部オブジェクトをExcelVBAから操作するのに  記述を誤った時(デバッグ前)だったと思います) そこで、何とか再現できないか、時間を掛けて試行錯誤してみましたが、 私の想像力では無理みたいです。 つまり、今の処、「経験なし」「再現できず」ということになります。 期待していたのならごめんなさい。 代わりに、そんな時私自身はどうするか、という話を書いておきます。 基本的には、通常通りデバッグして、【実際に】何処でエラーになっているか確認を試みます。   F8         ステップイン   Ctrl+ F8      カーソル行の前の行まで実行   F9         ブレークポイントの設定・解除 などを駆使して、ローカルウィンドウ、イミディエイトウィンドウを見れば、 問題点を見つけられることが多いです。 参考に  VBA基本(デバッグトレースの開始方法)  http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html スグには身につかないかも知れませんが、VBAを扱うなら必須ですので、 今回は無理でも、少しずつ、覚えるようにしてみてください。 イベントプロシージャを扱う時などは特に、 プロシージャでの様々な処理をトリガーにして 他のイベントプロシージャを実行していることに気が付かないこと、もありますから、 実際の処理の流れを確認するだけでも必ず役に立つと思います。 んで、それでもやっぱり見当が付かない場合は、仕方なく、 「入口から出口までひとつひとつ、特異な設定を疑いの目で確認してゆく」 ということになります。 因みに、#1で提示したコードについては、  新規のListBoxふたつとCommandButtonふたつをデフォルトのまま用意して  UserForm読み込み時にListBox1とListBox2に(行数が同じになるように)直接値を設定するようにして  (.Listプロパティ、.Columnプロパティ、AddItemメソッド、の何れかを用いてList作成)  UserForm.Show を実行して  ListBox1の何れかの行を選択して  CommandButton1またはCommandButton2をクリック 以上を、作成した環境で、間違いなく、他に余計なことは何もせず、過不足ないコードで、実行する限りでは どうやってもエラーが出せませんし、ふたつのListBoxのListが正しく並べ替えされます。 それぞれ50行のサンプルで、全行100往復以上テストしました。 # .Selected(nTgIdx - 1) = True #の部分は本来 # .ListIndex = nTgIdx - 1 #と書くのが普通ですが、どちらがニーズに合っているのか、こちらで判断できなかったので #そのまま.Selectedプロパティにしました(試しに書き換えてもいいですが解決策にはならないと思います)。 #その点を除けばかなり保守的な書き方をしたつもりです。 本題ですが、チェック項目として  1◆Book作成時と現在の実行環境で Application.Version に相違はないか?  2◆UserFormデザイン時のListBoxプロパティ設定で変更点(.RowSourceや.ControlSourceとか)はないか?  3◆UserForm読み込み(_Initializeや_Activateなど)時にListBoxのプロパティ設定を変更してないか?  4◆ListBox1とListBox2のList行数に相違はないか?  5◆ListBox2を他のListBox(ListBox3とか)と思い違いしていないか?  6◆CommandButton1_Click CommandButton2_Clickに他の記述を加えていないか?  7◆CommandButton1 CommandButton2 に他のイベントプロシージャを設定していないか?  8◆ListBox2に_Changeイベントや_Clickイベントを設定してないか?(前述)  9◆ListBoxに.ControlSourceプロパティを設定している場合、リンク先シートでWorksheet_Changeを設定してないか?  ◆全体として、同じ処理を別の場所で2度または複数回意図せず繰り返しているような構造になっていないか? 他にも確認すべき事柄があるとは思いますが、おおよそ、こんな感覚で、 とにかく疑ってみる、疑わしいポイントをさぐる、ということです。 エラーの【原因】がある、としたら、【原因】は、ひとつではないような気もしています。 もし、以上のチェックについての答えがすべて「ない」ということだと、私としてはお手上げです。 その場合私なら、【破損】と結論付けて、UserFormを一から作り直すとか、試しにエクスポートしてみるとか、ですかね。 一応少し補足を。 ・ListBoxに.RowSourceプロパティを設定した場合、並べ替えは当然エラーになります。  もっとも通常は、今回問題のエラーとは別のエラーですが。 ・#1の   With ListBox2     For i = 0 To .ColumnCount - 1       myBuf = .List(nTgIdx - 1, i)       .List(nTgIdx - 1, i) = .List(nTgIdx, i)       .List(nTgIdx, i) = myBuf     Next i     .Selected(nTgIdx - 1) = True   End With  これ、2回(偶数回)実行すると、見た目上、並べ替えしていないように見えます。  奇数回実行すると、1回並べ替えした時と同じように見えます。 ・イベントプロシージャについては一般的に、例えば、  ListBox2_Changeイベントで、普通にListBox2.Valueを変更すると(間接的に変更された場合も)、  再帰的にListBox2_Changeイベントが(理論上)無限に繰り返されることになります。  都度都度、再描画するようなオブジェクトだと、このような場合、どんなエラーが出ても不思議ではないです。 以上、ヒント、にもなっていないかも知れませんが、、、。 【原因】をこちらから見ることが出来ませんので、どうしても 質問者さんの方で、ある程度選んだ情報を追加提示できないと、遠隔での解決は難しいです。 とりあえず、解決に近づくことを祈念しながら、待ってみますね、

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 意図を汲み取れていない点もあるかもしれませんが 試してみて期待通りでなければ、どう違うか言ってくださいね。  ListBox1選択中の行を1つ上(下)の行と並べ替える  同時にListBox2も連動して同じ位置の行を並べ替える  但し、ListBox1の1列目だけは並べ替えをしない ' ' ================================================== Private Sub CommandButton1_Click() ' okg7818134   Dim nTgIdx As Variant   Dim myBuf As Variant   Dim i As Integer ' ' 選択されている項目を1つ上げる。   nTgIdx = ListBox1.ListIndex   If nTgIdx < 1 Then Exit Sub   With ListBox1     For i = 1 To .ColumnCount - 1       myBuf = .List(nTgIdx - 1, i)       .List(nTgIdx - 1, i) = .List(nTgIdx, i)       .List(nTgIdx, i) = myBuf     Next i     .Selected(nTgIdx - 1) = True   End With   With ListBox2     For i = 0 To .ColumnCount - 1       myBuf = .List(nTgIdx - 1, i)       .List(nTgIdx - 1, i) = .List(nTgIdx, i)       .List(nTgIdx, i) = myBuf     Next i     .Selected(nTgIdx - 1) = True   End With End Sub ' ' -------------------------------------------------- Private Sub CommandButton2_Click() ' okg7818134   Dim nTgIdx As Variant   Dim myBuf As Variant   Dim i As Integer ' ' 選択されている項目を1つ下げる。   nTgIdx = ListBox1.ListIndex   If nTgIdx = Me.ListBox1.ListCount - 1 Or nTgIdx = -1 Then Exit Sub   With ListBox1     For i = 1 To .ColumnCount - 1       myBuf = .List(nTgIdx + 1, i)       .List(nTgIdx + 1, i) = .List(nTgIdx, i)       .List(nTgIdx, i) = myBuf     Next i     .Selected(nTgIdx + 1) = True   End With   With ListBox2     For i = 0 To .ColumnCount - 1       myBuf = .List(nTgIdx + 1, i)       .List(nTgIdx + 1, i) = .List(nTgIdx, i)       .List(nTgIdx, i) = myBuf     Next i     .Selected(nTgIdx + 1) = True   End With End Sub ' ' ================================================== 以上のように差し替えて実行して、結果が お望み通りか、どのように違うか、 しらせてください。 確認事項  ◆.Listのインデックスは必ず0から始まります。  対して.ListCountや.ColumnCountは必ず1から数えた総数を返します。 ご提示の > For j = 1 To 7 2列目から8列目に対して処理をしています。 つまり1列目は並べ替えしないという意味になっていますが、 これはお望み通りなのでしょうか。 もし、そうではなくて行全体を並べ替えたいということでしたらば、 上記、私が提示したコードの     For i = 1 To .ColumnCount - 1 を     For i = 0 To .ColumnCount - 1 と書き換えてください。  ◆同様に ご提示の > For k = 0 To 6 1列目から7列目に対して処理をしています。 でも、  ListBox2にはより多くの列があって、その内の1列目から7列目だけを処理する という意味なのか  ListBox2には7列あって全ての列に対して処理する という意味なのか 量りかねました。 なので、「1(2)列目から最終列まで」を対象に処理する という意味で 上記、私が提示したコードでは     ............ To .ColumnCount - 1 という書き方をしています。 直値で指定し直したほうがわかり易いようでしたら     ............ To 7     ............ To 6 などのように ListBox1、ListBox2、共に適宜指定し直してください。お任せします。  ◆ご提示のコードで難解な点。 > For j = 1 To 7   ' ListBox1 に対する処理   ' ... > For k = 0 To 6   ' ListBox2 に対する処理   ' ... > Next k > Next j 「ListBox2 に対する処理」が都合49回行われるようになっていますが この点は間違いなのかと思います。エラーの原因にも関わっていると思います。 たまたま49が奇数なので1回の処理と同じ結果になると思いますが、 何か意図があるのでしょうかね? さしあたり、  For j = 1 To 7   ' ListBox1 に対する処理   ' ...  Next j  For k = 0 To 6   ' ListBox2 に対する処理   ' ...  Next k という意図で書かれたもの、という前提でお応えしました。  ◆.ListIndexはListBox未選択の場合-1を返します。 ご提示の > If i < Me.ListBox1.ListCount - 1 Then では未選択の場合も処理に進んでしまいますから 当然エラーになります。 こうした理由で私が提示したコードでは条件分岐を書き換えています。  ◆エラーの原因については 特定出来てはいませんが、エラーの原因となる点を幾つか対処していますので あとは、実際の環境でどうなるかですね。 とりあえず以上です。

6338-tm
質問者

お礼

cj_mover様 ご回答頂きありがとうございました。 そしてお礼と返答が遅くなってしまって申し訳ありません。 色々説明不足だったにも関わらず丁寧に解説して頂き感謝してます。 >ListBox1選択中の行を1つ上(下)の行と並べ替える >同時にListBox2も連動して同じ位置の行を並べ替える はい、その通りです。 >但し、ListBox1の1列目だけは並べ替えをしない 1列目はデータがないのです。 >◆.Listのインデックスは必ず0から始まります。 >つまり1列目は並べ替えしないという意味 >ListBox2には7列あって全ての列に対して処理する 行全体を並べ替えたいのですが、 ListBox1は、1列目~8列目までありますが、1列目にはデータが入っていないので、 (同じファイル内の他のユーザーフォームとの兼ね合いで1列目は空いてます。) 1列目を含むと「Listプロパティを設定できません」のエラーになってしまいます。 それで、ListBox1は1から始めるforで設定していました。 ListBox2は1列目~7列目まであり、どの列にもデータが入っています。 書いて下さったコードのままの ListBox1→i = 1 To .ColumnCount - 1 ListBox2→i = 0 To .ColumnCount - 1 で実行させて頂きました。 ☆CommandButton2 まず、2行目を1行目に1つ上げる、や、 3行目を2行目にあげて、更に続けて1行目に上げる、 はエラーにはなりませんでしたが、 ListBox2の方が連動して繰り上がってない状態でした。 ☆CommandButton1 次に1行目を1行下に下げるや 2行目を3行目に下げるをを実行しますと、 > With ListBox2 > For i = 0 To .ColumnCount - 1 > myBuf = .List(nTgIdx + 1, i) >.List(nTgIdx + 1, i) = .List(nTgIdx, i) >.List(nTgIdx, i) = myBuf >Next i >.Selected(nTgIdx + 1) = True ←-----ココです >End With 「←-----ココです」のところで、 「実行時エラー -2147417848(80010108)  オートメーションエラーです。 起動されたオブジェクトはクライアントから切断されました。」 の、エラーメッセージがでます。 そして、ListBox2の方の並べ替えがされていない状態です。 引き続きご教授いただけましたら有り難いです。 よろしくお願い致します。

関連するQ&A

  • VB6 2つのListBoxをソート

    VB6で約3000のデータをListBoxに入れて有ります。 ListBox1=ファイル名 ListBox2=ファイルアドレス と2つに分けてListBoxに入れて有り、このインデックス値は双方常に一緒でなければなりません。 ここで困ってしまったのが、Sortedはどうすれば良いのか?です。 片方ソートでも両方ソートでも順番(インデックス値)がばらばらになってしまいます。 そこで下記方法でListBoxを更に3つ追加して(1つをSorted)1つ1つソートしたインデックス順に並び替えたらソートに時間がかかってしまいました。 何か良い方法は無いでしょうか? (ListViewは経験が無いためこの方法の場合はやり方又は参考サイトを入れて頂けると助かります) Dim i As Integer Dim j As Integer Dim k As Integer k = LI1.ListCount - 1 For i = 0 To k LI3.AddItem LI1.List(i) LI4.AddItem LI2.List(i) LI5.AddItem LI1.List(i) 'SortedのListBox Next i LI1.Clear LI2.Clear For i = 0 To k For j = 0 To k If LI3.List(j) = LI5.List(i) Then LI1.AddItem LI3.List(j) LI2.AddItem LI4.List(j) Exit For End If Next j Next i LI3.Clear LI4.Clear LI5.Clear '(LI = ListBox)

  • Excel UserForm ListBox

    Excel UserForm ListBoxの表示についての質問です Sheets("加工").Range("A44")からRange("G" & LastRow)のセルの値を Form_receipt.ListBox1に表示させたいのですが C~E列は数値なので桁数区切りで表示したくてマクロを作ったのですが A列1列しか表示されないマクロになってしまいました。 どこが悪いのかご教示願えませんか? あわせてC~E列を右揃えでリスト表示する方法も教えてください 失敗作のマクロは以下です Sub Macro48() Form_receipt.ListBox1.Clear Sheets("加工").Select '配列の定義 Dim myRng As Range Dim myList As Variant Dim c As Variant Dim i As Integer Dim j As Integer Dim LastRow As Integer For j = 45 To 94 If Sheets("加工").Range("A" & j).Value = "" Then Exit For End If Next j If Sheets("加工").Range("A47").Value = "" Then LastRow = j - 1 Else LastRow = 46 End If Set myRng = Range("A44", Range("A" & LastRow)) ReDim myList(myRng.Rows.Count - 1, 7) For Each c In myRng myList(i, 0) = c.Offset(, 0).Value myList(i, 1) = c.Offset(, 1).Value myList(i, 2) = Format$(c.Offset(, 2).Value, "@@@,@@@,@@@") myList(i, 3) = Format$(c.Offset(, 3).Value, "@@@,@@@,@@@") myList(i, 4) = Format$(c.Offset(, 4).Value, "@@@,@@@,@@@") myList(i, 5) = c.Offset(, 5).Value myList(i, 6) = c.Offset(, 6).Value myList(i, 7) = c.Offset(, 7).Value i = i + 1 Next c Form_receipt.ListBox1.List() = myList Set myRng = Nothing 'リスト表示幅設定 With Form_receipt.ListBox1 .ColumnWidths = "30,0,60,60,60,150,50" End With Form_receipt.Show End sub

  • エクセルVBAプログラム質問 リストボックス応用

    エクセルVBAプログラムについて質問です。 リストボックスから結果をリストボックスに表示させる リストボックスを応用した内容です。 (1)今回追加したいのは、チェックボックスにチェックすることで、 期限が今月中に切れるもののみをリストボックスに表示させたいです。 (2)期限更新ボタンを押したら、3カ月プラスして延長させたいです。 期限更新したら、リストボックスの中身も更新したいです。 例(1):今日の日付 2018/9/23だとしたら、期限切れる(9月分すべて)を表示させたい。 例(2):期限(変更前)『2018/9/23』から期限(変更後)『2018/12/23』に変更 下記のプログラムで追加していきたいです。 Dim myData Private Sub UserForm_Initialize() Dim Dic, Keys, buf As String, i As Long Me.ComboBox1.Style = fmStyleDropDownList Me.ListBox1.ColumnCount = 4 Me.ListBox1.ListStyle = fmListStyleOption Me.ListBox1.MultiSelect = fmMultiSelectMulti Me.CommandButton1.Caption = "印刷" Me.CommandButton1.Enabled = False With Worksheets("DATA") myData = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 2 To UBound(myData, 1) buf = myData(i, 1) Dic.Add buf, buf Next i Keys = Dic.Keys For i = 0 To Dic.Count - 1 Me.ComboBox1.AddItem Keys(i) Next i Set Dic = Nothing End Sub Private Sub ComboBox1_Change() Dim i As Long, j As Integer With Me.ListBox1 .Clear For i = 2 To UBound(myData, 1) If Me.ComboBox1.Value = myData(i, 1) Then .AddItem "" For j = 2 To 5 .List(.ListCount - 1, j - 2) = myData(i, j) Next j End If Next i End With End Sub Private Sub ListBox1_Change() Dim i As Long, cnt As Long With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then cnt = cnt + 1 End If Next i End With Me.CommandButton1.Enabled = (1 <= cnt And cnt <= 2) End Sub Private Sub CommandButton1_Click() Dim ws As Worksheet, i As Long, j As Integer, cnt As Byte Set ws = Worksheets("印刷") ws.PageSetup.PrintArea = "$I$2:$P$5" ws.Range("J2:L5,N2:P5").ClearContents With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then ws.Range("J2").Offset(0, cnt).Value = Me.ComboBox1.Value For j = 0 To 2 ws.Range("J5").Offset(j * -1, cnt).Value = .List(i, j) Next j cnt = cnt + 2 End If Next i End With Unload Me ws.PrintPreview End Sub

  • ListBoxで表示されたデータの取得方法は

    お世話になります。 標準フォーム から以下のリストボックスを表示して、無事シートの一覧が表示されています。 Private Sub UserForm_Initialize() Dim lastRow As Long Dim myData Worksheets("Sheet1").Range("a1:C35").Value = "" With Worksheets(Sheet) myData = .Range(.Cells(1, 1), .Cells(Rows.Count, 3).End(xlUp)).Value End With With ListBox1 .ColumnCount = 3 .ColumnWidths = "20;70;100" .List = myData End With End Sub このリストボックスにはボタンが二つありボタン1を押したときに標準フォームへ[hinban] という変数にリストボックスでフォーカスしているデータを取り込みたいのですが以下の方法でうまくいきません。 Private Sub CommandButton1_Click() Dim lastRow As Long Dim i As Integer hinban = ListBox1.Column(pvargColumn:=1) End Sub もう一つのボタンは何もせずにリストボックスを閉じたいのですがこれで問題ないですか。 Private Sub CommandButton2_Click() Unload Me End Sub プログラム初心者でインターネットから寄せ集めのプログラムです。 どなたかお力をお貸しください。

  • For~Nextルーチンで最初の1回しか処理してくれません(Excelマクロ)

    ご覧いただきありがとうございます。 Excelで下記のようなマクロを書いたのですが、思ったような処理をしてくれません。色々なWebページや参考書に当たってみましたが、どうしてもわかりません。どの点が間違っているのか、どう直したらよいか、ご教示いただけませんでしょうか。 なお、意図している処理は次のようなものです。  ・セルB2:B21のデータをリストボックスに表示(この部分は別途作成済みです)  ・リストボックスに表示されている項目をユーザーが複数選択する  ・選択後コマンドボタン2をクリックすると、選択された項目を含む行を削除する 以上ですが、選択した項目のうち最初のものだけを削除しただけで終了しています。お手数をおかけいたしますが、よろしくお願いいたします。 Private Sub CommandButton2_Click() Application.ScreenUpdating = False Dim I As Integer If ListBox1.ListIndex = -1 Then MsgBox "選択されていません" Exit Sub End If Dim myStr(19) As Variant Dim myCell(19) As Variant With ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then MsgBox .List(i) myStr(i) = .List(i) Set myCell(i) = Workbooks("PERSONAL.XLS").Sheets(1).Range("B2:B21").Find(myStr(I), , xlValues, xlWhole) ThisWorkbook.Activate myCell(i).EntireRow.Delete End If Next i End With Unload Me Application.ScreenUpdating = True End Sub

  • エクセルVBAで検索結果セル位置抽出時、実行時エラーが出ます。

    エクセルVBAで  ・シート"log"のA列にある文字列(A1="AB<CD>EF")を2つにわけて、それぞれシート"edit"のセルに保存(A1="<CD>")(B1="EF")し  ・さらにA1セルをシート"NameList"にあるリストを元に置換する という作業をさせるマクロを組んでいるのですが、 途中で「アプリケーション定義またはオブジェクト定義のエラーです」が出て困ってます。 組んだマクロは下記の通りです。 Option Explicit Option Base 1 Sub Edit() Dim i As Integer Dim log_lastrow As Integer Dim list_lastrow As Integer Dim all As String Dim main As String Dim hn As String Dim chr() As Variant Dim j As Integer Dim k As Integer Dim chrname As String Dim cell As Range Dim line As Integer log_lastrow = 100 list_lastrow = 100 ReDim chr(list_lastrow, 4) For j = 1 To list_lastrow For k = 1 To 2 chr(j, k) = Sheets("NameList").Cells(j , k).Value Next Next For i = 1 To log_lastrow all = Sheets("log").Cells(i, 1).Value hn = Mid(all, InStr(all, "<"), (InStr(all, ">") - 2)) main = Right(all, Len(all) - InStr(all, ">")) Set cell = Sheets("NameList").Columns("A:A").Find(what:=hn, lookat:=xlWhole, MatchCase:=True, matchbyte:=True) line = Sheets("NameList").Range(cell).Row  chrname = chr(line, 2) Sheets("edit").Cells(i, 1).Value = chrname Sheets("edit").Cells(i, 2).Value = main Set cell = Nothing Next End Sub 下から7行目の line = Sheets("NameList").Range(cell).Row 1行上で検索されたセル位置情報の行番号をlineに入れようと思ったのですが、ここでエラーが出ます。何が悪いのかよろしくご教授願います。

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

    リストボックス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

  • 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 何故、改行が必要なのでしょう。 参照ページでも歓迎です。宜しくお願いします。

  • VB2008: リストメンバーの列数の求め方?

    Sub Main()   Dim I As Integer   Dim J As Integer   Dim K As Integer   Dim aDatas As New List(Of String())()   Dim N = CSVReadToArray("D:\Temp\付属一覧.csv", aDatas) - 1   K = aDatas(0).Count - 1   For I = 0 To N     For J = 0 To K       Debug.Print(aDatas(I)(J))     Next J   Next I End Sub 質問1、K = aDatas(0).Count - 1 の本当のやり方? 質問2、K の処理のされ方。 K が変数としてメモリに配置されることはないと推察しています。 多分、何がしかのスタック領域に一時的に置かれると・・・。 この辺りに関しても教えてもらえれば幸いです。

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

    下記コードではリストボックあ行選択しテキスト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

専門家に質問してみよう