• ベストアンサー

Excelで質問です。ListBoxの項目を別bookから読込むには

Excelで質問です。ListBoxの項目を別bookから読込むには VBA初心者です。 book-AのListBox1からbook-Bのセルの項目を読み込むことは可能なのでしょうか。 Excel2003です。 book-AのUserForm1に下記のコードを実行しても構文エラーになってしまいます。 book-Aとbook-Bは同じフォルダに入っています。出来ればbook-Bを閉じた状態で実行できれば良いのですが Private Sub UserForm_Initialize() ListBox1.RowSource =[book-B.xls]Sheet1!A1:A10 End Sub

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

  • ベストアンサー
  • myRange
  • ベストアンサー率71% (339/472)
回答No.5

●Book-Bを開かないで処理 '------------------------------------------------- Private Sub UserForm_Initialize()  Dim i As Long  Dim myVal  Dim myPath As String myPath = "'" & ThisWorkbook.Path & "\[Book-B.xls]Sheet1'!"  For i = 1 To 10   myVal = ExecuteExcel4Macro(myPath & "R" & i & "C1")   ListBox1.AddItem myVal  Next i End Sub '-------------------------------------------------- ●Book-Bを開くが非表示にして処理 '-------------------------------------------------- Private Sub UserForm_Initialize()  Dim BK2 As Workbook  Set BK2 = Workbooks.Open(ThisWorkbook.Path & "\Book-B.xls")  ActiveWindow.Visible = False '●ブック非表示  ListBox1.List = BK2.Sheets("Sheet1").Range("A1:A10").Value  BK2.Close False End Sub '------------------------------------------------------ 以上です。

lanbee
質問者

お礼

早速の回答ありがとうございます。 望んだ通りの結果が得られました。 本当にありがとうございました。感謝いたします。

その他の回答 (4)

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

>book-Aとbook-Bは同じフォルダに入っています。出来ればbook-Bを閉じた状態で実行できれば良いのですが そういうふうに言われると、裏技的になりますね。 >ListBox1.RowSource =[book-B.xls]Sheet1!A1:A10 RowSource っていうことはないのですが、ExecuteExcel4Macro で配列で取る方法はあっても、配列では出力しないのです。以下は、ROWSを使っているように、縦にデータがあります。 '// Private Sub UserForm_Initialize() Dim myFormula As String Dim rowCount As Long Dim i As Long, j As Long Dim Ar() As Variant 'パス名(フルパスで) Const myPath As String = "'C:\My Documents\[book-B.xls]Sheet1'!$I$1:$I$16" 'R1C1に変更(上記の数式が、R1C1なら以下は不要) myFormula = Application.ConvertFormula(myPath, xlA1, xlR1C1, xlAbsolute) rowCount = Application.ExecuteExcel4Macro("ROWS(" & myFormula & ")") ReDim Ar(rowCount - 1) For i = 1 To rowCount  Ar(j) = Application.ExecuteExcel4Macro("INDEX(" & myFormula & "," & i & ",0 )")  j = j + 1 Next ListBox1.List = Ar End Sub

lanbee
質問者

お礼

回答ありがとうございます。 早速実行してみたのですが、うまく働かないようです。 コードは完璧でも私が未熟でうまく生かせない可能性が大きいです。 大変申し訳ありません。これからこのコードを理解できるように努力したいと思います。 ありがとうございました。

回答No.3

とりあえず説明つきで簡単に書きますね^^ 詳細があればいつでもPG変更して載せますよ♪♪ 頑張れーーーー♪ Dim A_book As String Dim B_book As String Dim tmp As String '現在アクティブなbook名を取得します A_book = ActiveWorkbook.Name 'Workbooks.Open でファイル名を指定してbookを開きます 'ActiveWorkbook.Path は現在実行中のbookのディレクトリを意味します Workbooks.Open Filename:=ActiveWorkbook.Path & "\book-B.xls" B_book = ActiveWorkbook.Name ' 'bookを開くとそこがアクティブになるのでbook-B.xlsの"A1"の値を取得します tmp = Range("A1").Value 'bookを閉じます Windows(B_book).Close 'コピー完了です Range("A1").Value = tmp

lanbee
質問者

お礼

回答ありがとうございます。 早速実行してみたのですが、うまく働かないようです。 コードは完璧でも私が未熟でうまく生かせない可能性が大きいです。 大変申し訳ありません。これからこのコードを理解できるように努力したいと思います。 ありがとうございました。

回答No.2

下記で、対応可能と思います。 処理上、どうしてもファイルBを開く必要がありますが 裏で処理をさせれば、ユーザが意識する事は有りません。 いかがでしょうか? コード内の★の部分を変更すれば、 他の条件でも対応可能です。 Dim B_FileName Dim B_FILE_PATH Private Sub UserForm_Initialize() Dim xlApp Dim xlA_Book Dim xlB_Book Dim xlA_Sheet Dim xlB_Sheet Dim arrTmp As Variant Dim StrVal As String Dim FormList As Variant Dim lngI As Long '========================================== B_FileName = "\book-B.xls"    '★ B_FILE_PATH = ThisWorkbook.Path & B_FileName '========================================== Set xlApp = Excel.Application Set xlA_Book = ThisWorkbook 'Workbook Set xlA_Sheet = xlA_Book.ActiveSheet 'Worksheet Workbooks.Open B_FILE_PATH Set xlB_Book = ActiveWorkbook Set xlB_Sheet = xlB_Book.Worksheets("Sheet1") 'Worksheet ActiveWindow.WindowState = xlMinimized 'リスト情報を取得する With xlB_Sheet arrTmp = .Range(.Cells(1, 1), .Cells(10, 1))  '★ End With 'FileBを閉じる xlApp.DisplayAlerts = False xlB_Book.Close xlApp.DisplayAlerts = True ' 'リストに表示するために置き換える ReDim FormList(0) For lngI = 1 To UBound(arrTmp, 1) StrVal = arrTmp(lngI, 1) 'セル内の文字列を格納する If StrVal <> "" Then '空白はリストに表示しない FormList(UBound(FormList)) = StrVal ReDim Preserve FormList(UBound(FormList) + 1) '配列を一つ増やす End If Next 'FileAをアクティブにする xlA_Sheet.Activate ListBox1.List = FormList End Sub

lanbee
質問者

お礼

長文による早速の回答ありがとうございます。 ListBox1に項目が表示されました。しかし、UserForm1を表示したと同時に、ウインドウが縮小される 現象が起こるようです。

回答No.1

VBAが大好き社会人です笑 book-Bのセルの値をbook-Aのセルに持ってきたいって事でいいですよね? すぐにPGを作成してあげるので返答よろしくです。 詳しく何をどうしたいか説明してくれれば全部作ってサンプルPGを載せますよ^^ 私にまかせて下さい!!

関連するQ&A

  • フォームのリストボックスに値を表示させたい

    VBA フォームのリストボックスに値を表示させたい A1→aaa A2→bbb リストボックスに上記の値を表示させたいなら、 Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "Sheet1!A1:A2" End Sub で出来ますが、シート上のセルで表示する値を指定するのではなく、VBA上で、リストボックスに表示させる値を指定したいのです。 Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "aaa,bbb" End Sub を実行すると、VBA実行時エラー380になってしまいます。 UserForm1.ListBox1.RowSource = "aaa;bbb" もダメでした。 ご回答よろしくお願いします。

  • シート上のリストボックスに値を表示するには?

    エクセル2003です。 コントロールツールボックスからシートにリストボックスを設置しました。 ここに値を指定するにはどうすればいいでしょうか? フォーム上のリストボックスなら Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "Sheet1!a2:a3" End Sub とすればいいのですが シートのイベントにInitializeはありません。 どこのイベントプロシージャーに 「リストボックスに値を表示する」というコードを書けばいいのでしょうか? シートモジュールにに Private Sub ListBox1_Click() UserForm1.ListBox1.RowSource = "Sheet1!a2:a3" 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 クリックして項目を選択しても背景の色が変わりません。 何か見落としている事があるでしょうか? 又はやり方が悪いのでしょうか? お教え頂けると助かります。 以上、宜しくお願い申し上げます。

  • Excel VBA ブックが閉じれない

    Excel2016を使用してVBAを使用しています。 VBA初心者ですが、よろしくお願いします。 質問内容は以下になります。 EXCEL起動と同時にUserFormを表示させ、UserForm上のコマンドボタンから ダイアログボックスを表示し、他ブックを開く処理なのですが、 他ブックを開くまでは問題ないのですが、他ブックが閉じれない状態になります。 Private Sub Workbook_Open() UserForm1.Show End Sub Private Sub UserForm_Initialize()  各種処理 End Sub Private Sub CommandButton1_Click() Dim OpenFileName As String SetCurrentDirectory (Worksheets(1).Cells(11, 3)) OpenFileName = Application.GetOpenFilename("Microsoft Excelブック,*.xls?") Workbooks.Open OpenFileName End Sub UserFormを閉じると開いたブックも閉じることが可能です。 タスクマネージャーから強制的に終了しようとすると、以下メッセージが出ます。 ”開いているダイアログボックスがあるため、Microsoft Excel を終了できません。[OK]をクリックしてから、Microsoft Excelに切り替えてダイアログを閉じて下さい。" UserFormを閉じないで他ブックを閉じるには、どうすれば宜しいでしょうか。 申し訳ございませんがご教授下さい、よろしくお願いいたします。

  • Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい

    Excel VBA ブックが本当に閉じられた時だけ別のブックを閉じたい A.xls B.xls と二つのブックがあります。 A.xlsが閉じられる時、B.xlsも同時に閉じたいです。 A.xlsに以下のマクロを入れました。 Private?Sub?Workbook_BeforeClose(Cancel?As?Boolean) ?Workbooks("B.xls").Close?SaveChanges:=False End?Sub 問題はA.xlsが保存してない場合、「A.xlsへの変更を保存しますか?」というメッセー ジが 出てきますが、そこでキャンセルを押された場合でもB.xlsが閉じられてしまいます。 A.xlsが本当に閉じられた時だけB.xlsを閉じたいのですが そのようなことは可能でしょうか?

  • エクセル リストボックスにセルの値を表示したい

    Sheet1に A1 a A2 i A3 u と入力されています。 フォームのリストボックスにこの3つのセルを表示したいのですが Private Sub UserForm_Initialize() UserForm1.ListBox1.ControlSource = Sheets("Sheet1").Range(Cells(1, 1), Cells(1, 3)) End Sub ではうまく行きません。 デバッグしてもなにも引っかからないのですが 実行すると 「実行時エラー13 型が一致しません」 となります。 「ControlSource」を「RowSource」に変えても同じでした。 ※列が移動するため列番号を変数で取得したいのでCellsを使用しています。 ご教授よろしくお願いします。

  • 「フォームが属する項目の」とは?

    エクセルです。 Private Sub UserForm_Initialize() Me.StartUpPosition = 1 End Sub Private Sub UserForm_Initialize() Me.StartUpPosition = 2 End Sub 二つの違いってなんでしょうか? どちらもフォームの中央に表示されるのですが。 http://www.officepro.jp/excelvbaform/form_form/index4.html を見ると、 1→フォームが属する項目の中央の位置。 2→画面全体の中央の位置。 とのことですが、「フォームが属する項目の」とはどういうことなのでしょうか?

  • Excel VBAで別のブックからユーザーフォームの閉じる

    Excel VBAで別のブックからユーザーフォームの閉じたいのですが うまくいきません。 教えてください。 Private Sub CommandButton2_Click() Application.Visible = False Unload Workbook.("材料リスクマップ検索Ver2.xls")UserForm3・・・・※ Workbooks.Close userform3:=ThisWorkbook.Path & "あああ.xls" Workbooks("\いいい.xls").Close savechanges:=False UserForm1.Show vbModeless End Sub ※印のところが赤字にかわります。 コマンドボタン2は、いいい.xlsにあり、フォームを閉じたいのはあああ.xlsのUserform3です。 その後、ファイル名いいい.xlsは閉じます。 コードが間違っているかと思いますが、どんな風にすればよいかわかりません。初歩的なこととは思いますがよろしくお願い致します。

  • excel vba listboxについて

    EXCELのVBA LISTBOXに関することで質問です。 ワークシート1のA2-5セルに取引先名を入力してあります。 UF1という名前のユーザーフォームの中にリストボックスを作成し、ワークシート1のA2-5の取引先を表示するには、 Private Sub UserForm_Initialize() Dim torihiki As String torihiki = Worksheets(1).range("A2:A5") UF1.ListBox1.List() = torihiki End Sub と打ち込んでいます。 ちなみに、ユーザーフォームは以下のようにOKボタンで閉じるようにしました。 Private Sub CommandBottan1_Click() unload UF1 End Sub 質問したいのはここからですが、 上のユーザーフォーム内のリストボックスで選択された取引先をTRHKという変数に代入したい場合、どうしたらいいのでしょうか? 私の少ない知識を振り絞って以下のように考えてみたのですが、 TRHK = UF1.ListBox1.List() としても代入されていないようです。 List()ではないメソッドが必要なのだと思うのですが・・・・ .Selectedとかでしょうか? どなたか、ご教授願います! 宜しくお願い致します。

  • Excel コンボボックス2つ以上の時のコード

    ユーザーフォームでコンボボックスを2つ作ったのですが、1つだけのときはうまくいったのですが、二つ目をつくったら、エラーが出てしまいました。 コード入力は、Initializeに入力してあります。 Private Sub UserForm_Initialize() ComboBox1.Style = fmStyleDropDownCombo ComboBox1.RowSource = "sheet1!F2:F7" ComboBox1.ListIndex = -1 End Sub Private Sub UserForm_Initialize() ComboBox2.Style = fmStyleDropDownCombo ComboBox2.RowSource = "sheet2!B2:B3" ComboBox2.ListIndex = -1 End Sub コンボボックス1だけはうまくいったのですが、コンボボックス2をつくったら名前が適切でありませんとエラーがでました。 どのようにしたらいいですか?教えてください。

専門家に質問してみよう