Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11全般 : Excel 2021)
ブックを開かないでリストを参照したい
投稿日時: 26/03/12 22:38:17
投稿者: tomisuke

氏名が記載されているブック(日報.xlsm)があり、もう一つのブック(業務.xlsm)に氏名を選択して記載したいです。
その際に氏名が記載されているブック(日報.xlsm)を開かずに、もう一つの記載したいブック(業務.xlsm)のuserformのcombobox1にリストとして参照したいのですが、上手くいきません。
 
Private Sub Userform_Initialize()
 Me.ComboBox1.RowSource = "E\[日報.xlsm]氏名!C3:C25"
End Sub
 
どうか、みなさんのお力をお借りしたいです。
よろしくお願いいたします。

回答
投稿日時: 26/03/13 10:14:56
投稿者: Suzu

VBA は あくまで、動作をコードの命令の通りに実行します。
 
手動で行うとき、RowSource に指定してある ブックが開かれてない場合
ComboBox は リストを取得できません。
 
これは、ComboBox の仕様であり、
VBA であろうと、RowSource に 開いていないブックのパス・アドレスを指定しても
リストを取得できない事には変わりません。
 
となると、
ComboBox を使うなら
 ・RowSource は そのままに、(非表示で) ブックを開く
 ・RowSource は 使用せずに、AddItem を使い リストを追加
     非表示で ブックを開く
    ExecuteExcel4Macro を使う
        https://www.moug.net/tech/exvba/0060037.html
 
でしょうか。

投稿日時: 26/03/17 07:57:24
投稿者: tomisuke

Suzu様、返信ありがとうございます。
 
どうにもならなそうなので、「日報.xlsm」内の氏名を「業務.xlsm」内の要らないセルにコピーしてuserformのcombobox1にリストとして参照する事といたしました。
 
しかし、氏名をコピーする際に
 【実行時エラー ‘91’: オブジェクト変数または With ブロック変数が設定されていません。】
が出てしまい、困っています。
userformは、WorkbooksのOpenメソッドを使用してexcelを立ち上げると表示させています。
下記の部分がなければ、正常に動作します。
 
解決策をお願いいたします。
本当に申し訳ありません。
 
Private Sub UserForm_Initialize()
 
Dim A,B,D
Dim i AS Long
 
With ActiveSheet
 A="E:"
 B="日報.xlsm"
 
For i =1 To 30
  D = .Cells(i, 3).Address
  .Cells(i, 20) = "='" & A & "\[" & B & "]氏名'!" & D
  .Cells(i, 20).Value = .Cells(i, 20)
 
    If .Cells(i, 20).Value = 0 Then
         .Cells(i, 20) = ""
    End If
Next
End With
 
ComboBox1.List = ActiveSheet.Range("T1", ActiveSheet.Cells(Rows. Count, 20).End(xlUp)).Value
 LC1 = ComboBox1.ListCount
 ComboBox1.ListRows = LC1
 
ComboBox2.List = ActiveSheet.Range("T1", ActiveSheet.Cells(Rows. Count, 20).End(xlUp)).Value
 LC2 = ComboBox1.ListCount
 ComboBox1.ListRows = LC2
 
End Sub

回答
投稿日時: 26/03/17 10:21:00
投稿者: simple

「どうにもならない」とは具体的にどんなトライをして、何が問題だったのですか?
後学のために教えて頂きたいですね。
 
今回の方法では、数式が適切なものになっていないのが原因でしょうか?
それなら、マクロを作成するときの方法としてこんな方法があります。
・日報.xlsm を開く
・業務.xlsmのシートに計算式を書き込む。(日報ブックのセルをクリックして参照するだけです)
・日報.xlsm を閉じる
こうすれば、参照する計算式が残ります。
それをあなたの数式と比較して下さい。なにか相違があるのでは?
 
ところでE:ドライブとは何ですか?USBメモリそれとも自社ネットワーク上に割り当てたドライブですか?
参考までに教えて下さい。

回答
投稿日時: 26/03/17 14:22:43
投稿者: simple

エラーの発生個所を明確に示してください。
 
ツール - オプション - 「全般」の「エラートラップ」を
一時的に「エラー発生時に中断」にしたうえで実行し、
どの行でエラーが発生するのか明確にしてください。
(エラー解決が終わったら元の設定に戻して下さい)

回答
投稿日時: 26/03/17 20:50:45
投稿者: WinArrow

疑問点
 
最初のコードで
> Me.ComboBox1.RowSource = "E\[日報.xlsm]氏名!C3:C25"
→E\[日報.xlsm]・・・・コロンが抜けている?
C3:C25
と指定しているのに
ループ処理の中では1行目〜30行目を参照しているが、問題はないのですか?
 
ループせずに処理できるので、参考までに紹介します。
 
ループしないコードの例
 

D = "$C$3:$C25"
With ActiveSheet
    With .Cells(1, "T").Resize(.Range(D).Rows.Count)
        .Formula = "='" & A & "\[" & B & "]氏名'!" & D
        .Value = .Value
    End With
End With

トピックに返信