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

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

Wendy02の回答

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

acenoh 様、こんにちは。 何度も、検討してみました。 全体の概要が分りました。UserForm1 と UserForm2 は、両方立ち上げているのですね。 本当は、UserForm1 の中で、テキストボックスとリストボックスを両方を備えていたほうが、Excel本体を意識することなく使えるかと思いますが。 最初に、UserForm2 のTextBox1 のプロパティの IMEMode は、6-fmIMEModeKakanaHalf にしてください。 それから、以下のHPの内容は、今回の仕様に直接ではありませんが、Activate を使っていますので、多少疑問はもちながらも、一応、考慮して変更しました。 http://www.h3.dion.ne.jp/~sakatsu/Excel_Tips07.htm >ユーザーフォームで入力させると"よみ"をうまく読み取ってもらえず、 理由はわかりませんが、こちらでも、現象を確認しました。マクロで文字列を入力すると、何かがジャマしているようです。 ●ところで気になるのは、「エンド・ユーザ」名は出さなくてよいのでしょうか? ListBox1.List = mySh.Range(mySh.Range("h1"), mySh.Range("h1").End(xlDown)).Value ''"h1"はListBox1に表示したい列 もしかして、ListBox が、三つあるわけではありませんよね。 販売店名とエンドユーザ名の2列表示にすればよいと思いますが・・・。 ・ユーザーフォームの起動は、以下のように、DoEvents か、起動に多少の時間差をWaitで明示的に入れてあげるか、下位のPCや下位のVersionを考慮した場合、このほうが確実かもしれません。そのまま、UserFomr2に入ってしまうと、オブジェクトの取りこぼしがあるかもしれません。 '<シートモジュール> '--------------------------------------------- Private Sub CommandButton1_Click()  UserForm1.Show 0   DoEvents  UserForm2.Show 0 End Sub '--------------------------------------------- '<Userform1 モジュール> Dim myCrRange As Range Dim mySh As Worksheet Private Sub UserForm_Activate() 'Criteriaへの書き込み If UserForm2.TextBox1.Value = "" Then  myCrRange.Value = WorksheetFunction.Transpose(Array("=C1", "")) Else  myCrRange.Value = WorksheetFunction.Transpose(Array("=C1", UserForm2.TextBox1.Value)) End If myFilterExecute myCrRange 'サブルーチンへ ListBox1.List = mySh.Range(mySh.Range("H1"), mySh.Range("H1").End(xlDown)).Value ''"h1"はListBox1に表示したい列 End Sub Private Sub myFilterExecute(myCrRange As Range, Optional UniqFlg As Boolean = False) mySh.Range("H1", mySh.Range("H65536").End(xlUp).Offset(, 2)).ClearContents mySh.Range("B1", mySh.Range("B65536").End(xlUp).Offset(, 2)).AdvancedFilter _ Action:=xlFilterCopy, _   CriteriaRange:=myCrRange, _   CopyToRange:=mySh.Range("H1"), Unique:=UniqFlg ''B1からOffset(, 2)で選択範囲’H1から3列表示が抽出範囲 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'ここで終了させる Unload UserForm2 Set mySh = Nothing Set myCrRange = Nothing End Sub Private Sub UserForm_Initialize() Me.StartUpPosition = 1 'ここで設定 Set mySh = Worksheets("Sheet2") Set myCrRange = mySh.Range("F1:F2") '’検索条件範囲 End Sub '--------------------------------------------- '<Userform2 モジュール> Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode <> 13 Then Exit Sub  AppActivate "Userform1" End Sub Private Sub UserForm_Initialize()  Me.StartUpPosition = 0 End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) 'Userform2 単独では終わらせないようにする  If CloseMode = 0 Then   Cancel = True  End If End Sub '========================================= 変更点 <Userform1 モジュール> ・Private Sub UserForm_Activate() 初期に立ち上げたときに分岐をさせた。 If UserForm2.TextBox1.Value = "" クライテリア部分を、数式にした。  Array("=C1", "") ・Private Sub myFilterExecute サブルーチン側に移し、出力値を消去するようにした。 mySh.Range("H1", mySh.Range("H65536").End(xlUp).Offset(, 2)).ClearContents Uniqueフラグを設けて、オプションで、変更できるようにした。 Unique:=UniqFlg  ・UserForm_QueryClose の中で、UserForm2 を終了させた。 ・UserForm_Initialize で、StartUpPosition  の Userform2 の立ち上げと重ならないようにした。 <Userform2 モジュール> TextBox1_KeyDown で、"ENTER" コードで、UserForm1 に戻るようにした。 AppActivate "Userform1" UserForm1 のActivate イベントが作動しないことを考慮し、Userform1 自体を、Activate させた。 ・UserForm_QueryClose Userform2 側からは、終了できないようにした。 以上が変更、改良点です。

acenoh
質問者

お礼

ご紹介いただいたHP大変参考になりました。 どうしてそうなるのか、わからず使っていました。 仕方なくUserForm1からUserForm2を呼ぶ時は同じ大きさで 同じ場所に表示させていました。(下に隠れていて見えないから) >●ところで気になるのは、「エンド・ユーザ」名は出さなくてよいのでしょうか?  お話していませんでしたが、 UserForm2で、50音のコマンドボタンを配置し1文字を選択すると 選択した文字で(例”ア*”とシートのセルc2に書込みます) UserForm2をUnloadさせUserForm1をShowさせActivateした時に ListBox1で販売店名を表示(この時まだ、ListBox2は空欄) 中の1件をクリックするとその販売店の扱い店(エンドユーザ)を 表示するListBox2があるのです。 (クリックした時に別の場所で抽出するマクロを作成) ListBox2にあるエンドユーザをクリックするとUserForm1を閉じて 納品書(シート)に販売店名とエンドユーザ名を表示させています。  UserForm2からUserForm1を表示させた時、もし選択ミスをした時には キャンセルボタンでUserForm2に戻り1文字選択し直すようにしていますが 問題なく使用できています。(会社のpc(Office2000)で修正したからですかね?) アドバイスいただいた、DoEventsを使用したモジュールに 書き換えてみます。 大変参考になりました。一旦このスレッド閉じさせていただきますが Wendy02さんには又わからないことをお尋ねする事があるやも知りません その時はよろしくお願いいたします。

関連する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 -------------------------------------------