Excel (VBA)

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

 
(Windows 11 Home : Microsoft 365)
参照先ファイルを開くことなく実行は無理でしょうか
投稿日時: 25/01/22 14:49:05
投稿者: 春麗

フォームにIDを入力して実行ボタンをクリックすると,
該当する名前や住所等をフォームに表示させる様にマクロを作成し,問題なく動くのですが,
参照するファイルは必ず開く様にしないと無理なのでしょうか.
 
ちなみにこんな感じで作成しました
 
'入力したidをセット
id = TextBox1.Value
 
,参照ファイルとシートの指定
Set datafaile = Workbooks.Open("サーバー上のファイルの保存先")
Set wsData = dataBook.Sheets("ユーザー情報")
 
'該当するIDの行のデータを見つける
Set foundRow = wsData.Columns(1).Find(What:=sapid, LookIn:=xlValues, LookAt:=xlWhole)
 
'指定のボックスに表示
TextBox11.Value = wsData.Cells(foundRow.Row, 9).Value

回答
投稿日時: 25/01/22 16:11:08
投稿者: WinArrow

引用:

参照するファイルは必ず開く様にしないと無理なのでしょうか.

 
掲示のコードだけでは判断できませんが、
条件次第ですが、無理ではないです。
 
条件
ブックの参照シートがリスト形式になっていますか?
ADODBを使ったこといますか?

投稿日時: 25/01/23 14:44:11
投稿者: 春麗

どうもありがとうございます.
参照シートはリスト形式です
ADODBは知りませんでしたので,使い方を調べてみます.

回答
投稿日時: 25/01/23 17:47:16
投稿者: Suzu

Find を行っているのは、Loop を想定しているのでしょうか?
 
単一値 に対しての検索であり、同じ行の 9列目の値を取得したいのであれば
VLOOKUP では 不足なのでしょうか?
 
セル関数で、
=VLookUp検索値1,'C:\〜〜\[DATA.xlsx]Sheet1'!$A$1:$I$1000,9,0)
で、当該ファイルを開かなくとも取得できませんか?
 
 
それで満足するなら、
その数式を、VBA で、
セルの関数として 設定してあげれば良いでしょう。
 
Range("A1").FormulaLocal = "=VLookUp検索値1,'C:\〜〜\[DATA.xlsx]Sheet1'!$A$1:$I$1000,9,0)"
 
あとは、必要に応じて A1 の値を取得すれば良いです。
 
※ WorksheetFunction で、VLookUp を使用する場合には
 対象となるファイルが開いていないとエラーになりますので
 一度、セルの関数として設定する案としています。

回答
投稿日時: 25/02/09 21:34:59
投稿者: simple

春麗さん、↓で発言されるなら、こちらのスレッドを放置しないでもらえませんか?
https://www.moug.net/faq/viewtopic.php?t=82987
 
ちなみに、
VLookUp検索値1...
とカッコが抜けていますが、織り込んでいただいていますよね。
VLookUp(検索値1...

回答
投稿日時: 25/06/13 11:37:18
投稿者: simple

少し変則的ですが、こちらに
IFで書いた内容をVBAに
https://www.moug.net/faq/viewtopic.php?t=83062
のコメントを書きます。(新しいスレッドを建てるのもどうかと思いまして)
 
Excel365なら、B4セルに以下の式を入れますね。

=LET(
    n,COUNTIF(E4:F4,"あり"),
    IFS(AND(D4="A",n>0),"R1",
        AND(D4="A",n=0),"R2",
        AND(D4="B",n>0),"R2",
        AND(D4="B",n=0),"R3",
        D4="C","R3",
        TRUE,"")
)

 
VBAで書くならこんな感じですか?
 
Sub test()
    Dim n As Long
    Dim s As String
    
    n = Application.CountIf(Range("E4:F4"), "あり")
    Select Case Range("D4")
        Case "A": If n > 0 Then s = "R1" Else s = "R2"
        Case "B": If n > 0 Then s = "R2" Else s = "R3"
        Case "C": s = "R3"
        Case Else: s = ""
    End Select
    Range("B4") = s
End Sub 

確かに、割と基本的なことのようではありますが、項目によって理解に濃淡があるのでしょうか。

回答
投稿日時: 25/06/13 17:09:05
投稿者: Suzu

simple さん も書かれていたので 当方も用意していた回答を。。
 
ワークシート関数を正として VBAに置き換えるなら
 
標準モジュール
--------------------------------------------------------------------------------
Function fnc_B(D As Range, E As Range, F As Range) As Variant
  If D = "A" Then
    If E <> "あり" And F <> "あり" Then
      fnc_B = "R1"
    End If
    If E = "あり" Or F = "あり" Then
      fnc_B = "R2"
    End If
  Else
    If D = "B" Then
      If E <> "あり" And F <> "あり" Then
        fnc_B = "R2"
      End If
      If E = "あり" Or F = "あり" Then
        fnc_B = "R3"
      End If
    Else
      If D = "C" Then
        fnc_B = "R3"
      End If
    End If
  End If
End Function
--------------------------------------------------------------------------------
 
B4 : =fnc_B(D4, E4, F4)
 
でしょうか。
 
ユーザー定義関数にして、3つの引数を渡す様にしています。
 
 
ワークシート関数式 と 動作に関して違いがあります。
 ワークシート関数式:D4 に入力する値が、アルファベット 大文字小文字 に関わらず判定
 VBA       :D4 に入力する値が、アルファベット 大文字   のみ    判定
 
大文字 小文字 でも 同じ判定にするなら、
 ・小文字でも同じ判定結果となる条件式にする
 ・モジュール先頭に、Option Compare Text を入れる
のどちらかで行います。
 
 
 
If 〜 (Else 〜) End の 入れ子 構造が多く、条件判定の回数も多く 可読性が悪い ので
今回の様に、3つ のセルを参照し、それぞれのセルで入っている値が決まっているなら
Select Case を使う方が好みです。
 
大文字小文字 に関わらず 同じ様に判定する も入れています。

Function fnc_B_rev(D As Range, E As Range, F As Range) As Variant
    fnc_B_rev = 0
    Select Case StrConv(D, vbUpperCase) & (E = "あり" Or F = "あり")
      Case "A" & False: fnc_B_rev = "R1"
      Case "A" & True:  fnc_B_rev = "R2"
      Case "B" & False: fnc_B_rev = "R2"
      Case "B" & True:  fnc_B_rev = "R3"
      Case "C" & False: fnc_B_rev = "R3"
      Case "C" & True:  fnc_B_rev = "R3"
      Case Else
    End Select
End Function

 
 
関数にした場合、セルを決め打ちした場合に比べ
操作を行うユーザーの自由度は高くなります。
そうなると、ユーザーの操作をどこまで想定しエラー処理や例外処理として
関数に組み込むかを考慮する必要があります。
 
fnc_B / fnc_B_rev で言うなら
・一 引数 には、1セルを想定しているが、複数セルを渡された場合
・引数のセルの値が空白なら問題ないが、例えば#N/A が計算されているとき
   → ワークシート関数の時には、E7,F7 に #N/A があっても計算結果が返りましたが
    ユーザー定義関数では、#VALUE エラーとなってしまう。
 
【全く同じ】という場合には、上記の様な事も考慮する必要があるのかまで
ご検討ください。

トピックに返信