• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:>この様な経験された事ありますか?)

エクセルVBAでのプログラム移植時にListBoxに表示される列を変更する方法

Wendy02の回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。Wendy02です。 >リスト範囲はb1:c501 ということですが、「販売店よみ」は、どこにあるのですか? AdvancedFilter の範囲に、「販売店よみ」を含めなければ、検索できません。 B列が販売店名, C列がエンドユーザー, D列がよみ? 全体の位置情報が分らなくなりました。 また、クライテリア部分(検索条件範囲)は、1列しか使わなくても、2列の余裕を持ったほうがよいです。論理和検索だけでなく、論理積検索のことも考えなくてはなりません。今の話の流れからすると、E-F列をクライテリア部分にし、G列からということになってしまいます。 それから、 「読み」は、Phonetic 関数をお使いなのですか?半角全角の区別があります。メニューの書式-ふりがな-編集 で、全角か半角か、カタカナかを設定をみて、クリアテリア部分の入力を決定します。 もう1つは、Version(Excel 2002 のみ、ワイルドカード・オプションの違いがあります)によって、「アジア○○○」の時もあるので、「アジア*」というようにしてあげなくてはならない、ということがあります。 また、Excel 2002 以外(つまり Excel 2003 /Excel 2000 などということ)ですと、デフォルトが、ワイルドカード(文字に「*」をつけた状態)付きになっていますので、逆に、ワイルドカードなし状態にするには、このクライテリア部分を、2列にしないと、フィルタオプションを使いこなすのは難しいはずです。 >UserForm2でTextBox1アジアを入力したい時 正直なところ、UserFormをふたつにすることで、前回よりも、難しくなっています。手直ししてみましたが、たぶん、全部作り直しのほうが早いような気がします。任意の部分なので、タイミング(イベント)は、こちらでは決めかねますが、ボタンなどでUserForm2 を起動するなど考えなくてはなりません。いままでの、変数も、グローバルレベルに変更したほうが良いかもしれません。

acenoh
質問者

補足

再度のご返答ありがとうございます。惑わしてしまい申し訳ありません 実はWorksheet3は A1:No、B1:販売店、C1:販売店よみ、D1:エンドユーザ 又、抽出条件としてF1:(販売店よみ)抽出範囲にH1としています。 自分なりに教えていただいたマクロのセル位置を作り変えてみました。 Dim myCrRange As Range Dim myCrRange2 As Range Dim mySh As Worksheet Private Sub UserForm_Activate() Set mySh = Worksheets("Sheet2") Set myCrRange = mySh.Range("f1:f2") '’検索条件範囲 Set myCrRange2 = mySh.Range("l1:l1")'’UserForm2で一時書き込む所 '出力データは、ちゃんと消さないと次の検索に出てきません。 mySh.Range("F1", mySh.Range("F65536").End(xlUp).Offset(, 2)).ClearContents 'Criteriaへの書き込み myCrRange.Value = WorksheetFunction.Transpose(Array("販売店よみ", myCrRange2)) myFilterExecute myCrRange 'サブルーチンへ ListBox1.ColumnCount = 3 '3列表示 '列が離れすぎていたら、 'ColumnWidths | 30 ; 30 ;30  'などと入れます。 'RowSource よりもListのほうが動きが速い ListBox1.List = mySh.Range(mySh.Range("h1"), mySh.Range("h1").End(xlDown)).Value ''"h1"はListBox1に表示したい列 End Sub Private Sub myFilterExecute(myCrRange As Range) mySh.Range("b1", mySh.Range("b65536").End(xlUp).Offset(, 2)).AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=myCrRange, _ CopyToRange:=mySh.Range("h1"), Unique:=True ''b1からOffset(, 2)で選択範囲’h1から3列表示が抽出範囲 End Sub Private Sub UserForm_Terminate() Set mySh = Nothing Set myCrRange = Nothing End Sub UserForm2でセルl1に一時書き込み抽出条件としました。 なんとか目的を達することが出来ました。 ''のコメント部分がいろいろ数値を入れ替えて試した結果です まだエクセルVBの初心者の私には中身は理解出来ていないのですが! これは初心者なりに納品書入力プログラムの一部でしてUserForm1には他に品名入力など有りまして 抽出を多用しますとListBoxのRowSourceプロパティが原因でエラーになる事があり困っていました。 「読み」は、Phonetic 関数を使わず強引によみを単体で半角カタカナで入力しています。 (ユーザーフォームで入力させると"よみ"をうまく読み取ってもらえず、 販売店名とよみのテキストボックスを使っていますが良い方法があるのでしょうか?) Excel 2002 とExcel 2000でそのような事があったのですか、Excel 2003は所持していないのですが Excel 2002 で作成し(自宅pc)Excel 2000(事務所pc)で使用していますので気をつけます エクセルVBは変数を余り意識せず出来るので初心者の私はOption Explicitを表示させないで 使ってきましたが、今後、Dim宣言して使うようにいたします。

関連するQ&A

  • この様な経験された事ありますか?

    お尋ねします ユーザーフォームを使い客先データリスト(データ数:500件)から 目的の客先を抽出するのですが200件までしか抽出してくれません 抽出件数に制限があるのでしょうか? セルa1:No、b1:販売店名、c1:エンドユーザ、d1:販売店名、e1、販売店名 VBコードは以下です UserForm1にListBox1があり UserForm1をUserForm1.Showで表示させるとき Private Sub UserForm_Activate() Range("a1:c501").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:= _ Range("d1:d2"), CopyToRange:=Range("e1:e1"), Unique:=True End Sub としているのですが ListBox1には200件までしか表示されません ListBox1のプロパティの範囲RowSourceにe2:e501としていますのに セルd2には全て表示させるよう*を入力しています 上記だけを試してみると、ちゃんと500件、抽出するのですが実は 一寸大きなアプリケーションソフトの一部で動作させています メニュープログラム:880Kb、サブメニュープログラム:320Kb 本プログラム:1,200Kbが同時に開いています PCはデルでCPU:ペンティアム4、240GHz、メモリー512MB RAMです OS:XP(Pro)office2000(Pro)のエクセルを使用 素人考えでメモリを消費しすぎていて表示されないのかなと思っているのですが この様な経験をされた方、良い方法がありましたら、アドバイスお願いします。

  • ExcelVBAのユーザーフォームについて

    ExcelVBAのユーザーフォームについて ExcelVBAをゼロから独学で学んでる超初心者です。 ExcelVBAでデータベースを作っています。sheet1に配置してあるコマンドボタンでuserform1を開きそこに配置してあるlistbox1を選択するとuserform2~Xが開く設定にしています。 listbox1の内容はsheet2のデータのタイトルA~X(2列目~X列目)を読みに行っています。 userform2~Xの内容はsheet2のデータのタイトルA~Xのの内容を個別に作成しています。 流れはタイトルA(userform1-listbox1(1列目))を選択するとタイトルAの内容を表示(userform2)するというものです。userform2~Xはsheet2の上から順番に作っています。 sheet2の2列目の内容(タイトルA)→userform2 sheet2の3列目の内容(タイトルB)→userform3 という感じです。この状態だと問題なく開いていくのですが。このデータベースは後からタイトルをどんどん増やしていきます。そして、増やすたびにあいうえお順に並び替えをします。 そうすることによってタイトルと内容が合わなくなっていきます。例えば、 sheet2の2列目の内容が5列目(タイトルD)の内容に変更 sheet2の3列目の内容が2列目(タイトルA)の内容に変更 みたいな感じでバラバラになってしまいます。 流れがタイトルD(userform1-listbox1(1列目))を選択→タイトルA(userform2)を表示となってしまいます。 並び替えを行ってもタイトルとuserformがセットになる タイトルD(userform1-listbox1(1列目))を選択→タイトルD(userform4)を表示 となる様にするにはどうしたらよいのでしょうか? へたくそな説明でわかりにくかもしれないですが一生懸命書き込みました。 宜しくお願い致します。

  • リストボックスから項目を選択してセルに入力したいのです

    EXcel2003でマクロ作成中です。エクセルシートのN列を右クリックすると、ユーザーォームが現れ、その中のリストボックスから項目を選択すると選択文字が白色に反転します。 ユーザーホームの下方に設置した「入力する」ボタンをクリックする、アクティブセルにテキスト文字列が挿入されます。 Option Explicit Private Sub CommandButton1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub --------------------------- Private Sub CommandButton2_Click() Unload UserForm1 End Sub ------------------------------ これと同じものをB列につくりました。エクセルシートのB列を右クリックすると、リストボックスが表示されますが、その中の項目を選択しようとすると、一瞬にしてユーザーフォーム自体が消えてしまい項目を 選択できません。 Private Sub CommandButton1_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex) End If End With Unload UserForm2 End Sub ----------------------------- Private Sub CommandButton2_Click() Unload UserForm2 End Sub ------------------------------------------ まったく同じものを作って内容だけかえたのですが、できません。 どうしてでしょうか?ご教授おねがいします。

  • リストボックスについてです。

    リストボックスについてです。 B列をダブルクリックするとリストボックスが立ち上がり、データを選択してB列に表示できるように設定されていますが、困った現象が起こっています。 例えば、sheet1のB10にダブルクリックでリストボックスを表示し、そこから「あいうえお」という名前を表示させて、sheer1編集が終わったとします。 次のsheet2でB1をダブルクリックしているのに、sheet2のB10に勝手に「あいうえお」と表示されてしまいます。 コードは以下になってます。 VBA初心者なのでエクセルのサイト等からコピペ等して作ったコードです。 どこかおかしな箇所があると思うのですが、何処がおかしいのかがわかりません。 お分かりになる方、教えていただければ助かります。 ' ◆Worksheetのコード◆ '---------------------------------------------------- '選択範囲を変更したときに実行される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) UserForm1.ListBox1.RowSource = "データ!A1:A100"  '表示するデータ範囲 UserForm1.ListBox1.Font.Size = 12    'フォントサイズ If Target.Column = 2 Then 'B列なら 行 = Target.Row '行番号を取得する UserForm1.Show 'ユーザーフォームを表示する End If End Sub '=================================================================================== ' ◆UserForm1のコード◆ '-------------------------------------------------------------------------- Private Sub ListBox1_Click() 'クリックされたときに実行される If 行 <> 1 Then '1行目でなければ Cells(行, 2) = ListBox1.Value 'リストボックスの値をセルにセットする End If UserForm1.Hide 'ユーザーフォームを非表示にする End Sub Private Sub UserForm_Deactivate() '非アクティブになったときに実行される Unload Me 'ユーザーフォームをメモリから削除する End Sub '========================================================================================= '============================== ' ◆標準モジュールのコード◆ Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UserForm1 'ユーザーフォームをメモリに読み込む End Sub '==============================

  • ListBoxのBackColor変更

    EXCEL2007のVBAにて質問です。 ユーザーフォームにリストボックスを配置して、選んだ物によって リストボックスの背景色を変更しようとしているのですが、うまくいきません。 例えばlistbox1を以下の様にセットし、 Private Sub UserForm_Initialize() UserForm1.ListBox1.AddItem ("ピンク") UserForm1.ListBox1.AddItem ("白") End Sub 下記の通り選んだ項目で背景色を変えたいのですが、 Private Sub ListBox1_Click() '選んだ項目で色変え If UserForm1.ListBox1.ListIndex = 0 Then UserForm1.ListBox1.BackColor = RGB(255, 128, 128) 'ピンクなら背景をピンクに Else UserForm1.ListBox1.BackColor = RGB(255, 255, 255) '白なら背景を白に End If End Sub クリックして項目を選択しても背景の色が変わりません。 何か見落としている事があるでしょうか? 又はやり方が悪いのでしょうか? お教え頂けると助かります。 以上、宜しくお願い申し上げます。

  • エクセルVBA ユーザーフォームのリストボックス

    エクセルVBAのユーザーフォームのリストボックスについて教えてください。 現在、以下のようにコードがされています。 Private Sub UserForm_Initialize() With UserForm.ListBox1 .AddItem "ABC" .AddItem "DEF" .AddItem "GHI" .ListIndex = 0 End With End Sub Private Sub ListBox1_Click() With ListBox2 .Clear Select Case UserForm.ListBox1.List(ListBox1.ListIndex) Case "ABC" .AddItem "123" .AddItem "456" .AddItem "789" Case "DEF" .AddItem "456" .AddItem "789" Case "GHI" .AddItem "789" End Select .ListIndex = 0 End With End Sub それで、ユーザーフォームを起動した時点で、ListBox1には"ABC"、ListBox2には"789"を選択し、青く色がついている状態にすることは可能でしょうか。 よろしくお願いします。

  • 【ExcelVBA】ユーザフォーム初期化時にリストボックスのサイズを変更したい

    お世話になります。 ExcelのVBAを利用してマクロを作成しているのですが、ユーザフォームにリストボックスを設定し、任意の高さを調節したいと思っております。 ユーザフォームツールで、ユーザフォーム(UserForm1)を作成し、その中にリストボックス(ListBox1)を設定しました。 下記のコードはサンプルですが、なぜかリストボックスの高さが調整されないのです。。 コードが間違っているのでしょうか? 詳しい方、ご指導お願いします。。。 Private Sub UserForm_Initialize()  With UserForm1.ListBox1   .AddItem "テスト1"   .AddItem "テスト2"   .Height = 50  End With  'リストボックスの高さを表示する  Msgbox UserFrom1.ListBox1.Height End Sub ※Msgboxでは"50"と表示されず、ユーザフォームツールで設定した高さが表示されてしまいます。。

  • VBA ユーザーフォーム

    こんばんわ。 VBA、ユーザーフォームで、ListBoxか、Comboboxで、セルの値を参照し、そこから1つ選択するようにするにはどういうコードがりますか? Private Sub Userform_Initialize   Listbox1.AddItem "700" Listbox1.AddItem "701"   ・・・・・   ・・・・・   ・・・・・ End Sub と、やると、ListBoxには反映しますが、列が多すぎて、作成するのに手間が掛かる為、例えば、"700" の値に、Sheets(1)のC2から、C500の値を入れるようなコードはありますか? 宜しくお願いします。

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • シート名を変更すると、そのシートのデータがリストボックスに表示されない

    Vista SP1 ExcelXPでマクロ作成中の超初心者です。 シートA会社のセルを、右クリックすると、ユーザーフォームが現れ、その中のリストボックスにsheet1の データが表示されます。sheet2 sheet3 も同様に、正常にリストボックスが表示できています。 ところが、シートの名前 「sheet1」を、「関係データ1」に変更すると フォームにリストボックスが表示されますが、中身は表示されません。 シート名を変更しても、右クリックでリストが正常に表示できるようにするにはどうすればよろしいでしょうか。             1)ブックには,13枚のシートがあります。  1)シート名が  A会社からJ会社           sheet1 sheet2 sheet3 2)会社シートにはそれぞれ以下のコードを記入してあります。  Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 14 And Target.Row < 45 And Target.Column > 13 And Target.Column < 15 Then UserForm1.Show End If If Target.Row > 14 And Target.Row < 45 And Target.Column > 19 And Target.Column < 21 Then UserForm2.Show End If ユーザーフォームには、次のコードがあります。 Option Explicit Private Sub CommandButton1_Click() 'With ListBox1 'If .ListIndex = -1 Then 'MsgBox "項目を選択してくだい" 'Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub ------------------------------------------ Private Sub CommandButton2_Click() Unload UserForm1 End Sub 'Private Sub UserForm_Initialize() 'Me.StartUpPosition = 0 ' Me.Left = 200 ' Me.Top = 100 ' Me.Height = 400 ' Me.Width = 230 'End Sub Private Sub 閉じる_Click() Unload UserForm1 End Sub Private Sub ListBox1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) ActiveCell.Offset(0, 7).Value = ListBox1.list(ListBox1.ListIndex, 1) Selection.Offset(0, 7).Select End If End With Unload UserForm1 End Sub -------------------------------------------