質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

2121閲覧

VBA 他ブックから条件判定を行いデータを読み込ませたい

qqkf

総合スコア10

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/19 12:23

マクロの勉強している初心者です。
VBAで作ったファイルからからファイル選択後、自動で該当のセルに読み込ませるマクロを作成しています。
ファイル読み込み後は、該当セルに記載できたのですが条件判定付きでセルに記載を行いたいです。
前提として読み込ませるエクセルファイルは、読み込み中はオープンしないで作っています。

実現したいことは以下になります。
①項目に記載されているもの(黄色枠)を判断して、別のエクセルにデータ部分を読み込ませたい(画像2)。
②データ部分には記載されているが項目には記載されていないもの(赤枠)に対しては、
"項目がありませんでした"というメッセージを別のエクセルに記載させたい(画像1の赤枠)。

実際の画像が以下になります。
イメージ説明
画像1がファイル選択後、自動で黄色枠および赤枠に記載するマクロです。
クリアボタンはあるのですが無視してください。

イメージ説明
画像2が読み込ませるファイルです。

コードが以下になります。

VBA

1Private Sub Select_Read_FilesButton_Click() 2'---------------------------- 3'FType :ファイルの種類 4'FPath :ファイルの参照パス 5'Prompt :ダイアログのタイトル 6'WS :対象のシート名 7'Pos :参照先のセル 8'Target :読み込むパス 9'---------------------------- 10 Dim FType, Prompt, Target As String 11 Dim FPath As Variant 12 Dim WS As Worksheet 13 Dim Pos As Long 14 15 Set WS = Worksheets("データ情報") 16 17 '選択できるファイルの種類をxlsに限定 18 FType = "Excelブック,*.xls" 19 20 'ダイアログのタイトルを指定 21 Prompt = "対象データファイルを選択して下さい" 22 23 'ファイル参照ダイアログの表示 24 FPath = Application.GetOpenFilename(FType, , Prompt) 25 26 If FPath = False Then 27 'ダイアログでキャンセルボタンが押された場合は処理を終了 28 End 29 End If 30 31 'B3セルにファイル名をセット 32 WS.Cells(5, 7).Value = FPath 33 34 Pos = InStrRev(Cells(5, 7).Value, "\") 35 36 ' "'"はファイル名からシート名まで括る 37 Target = "'" & Left(Cells(5, 7).Value, Pos) & "[" & Mid(Cells(5, 7).Value, Pos + 1) & "]" 38 39 'ExecuteExcel4Macroで読み込んでいるエクセルファイルをオープンさせない 40 Range("E8") = ExecuteExcel4Macro(Target & "読み込みデータ'!R2C4") 'A Sample表示 41 Range("E9") = ExecuteExcel4Macro(Target & "読み込みデータ'!R3C4") 'B Sample表示 42 Range("C10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R4C4") 'C Sample表示 43 Range("E10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R6C4") 'D Sample表示 44 Range("G10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R8C4") 'E Sample表示 45 Range("I10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R10C4") 'F Sample表示 46 47End Sub

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/08/19 12:56

具体的に困っていることは何でしょうか?(単純にエクセルの検索機能を使用すれば良いのでは?)
qqkf

2020/08/19 13:20

ファイルを読み込んでる間に条件判定したのですが、どうコーディングしたらいいか困ってます。
guest

回答3

0

ベストアンサー

Vba

1Private Sub Select_Read_FilesButton_Click() 2'---------------------------- 3'FType :ファイルの種類 4'FPath :ファイルの参照パス 5'Prompt :ダイアログのタイトル 6'WS :対象のシート名 7'Pos :参照先のセル 8'Target :読み込むパス 9'---------------------------- 10 '↓1行で書く場合も型宣言は省略できない。 11 Dim FType As String, Prompt As String, Target As String 12 Dim FPath As Variant 13 Dim WS As Worksheet 14 Dim Pos As Long 15 16 Set WS = Worksheets("データ情報") 17 18 '選択できるファイルの種類をxlsに限定 19 FType = "Excelブック,*.xls" 20 21 'ダイアログのタイトルを指定 22 Prompt = "対象データファイルを選択して下さい" 23 24 'ファイル参照ダイアログの表示 25 FPath = Application.GetOpenFilename(FType, , Prompt) 26 27 If FPath = False Then 28 'ダイアログでキャンセルボタンが押された場合は処理を終了 29 End 30 End If 31 32 'B3セルにファイル名をセット 33 WS.Cells(5, 7).Value = FPath 34 35 Pos = InStrRev(Cells(5, 7).Value, "\") 36 37 ' "'"はファイル名からシート名まで括る 38 Target = "'" & Left(Cells(5, 7).Value, Pos) & "[" & Mid(Cells(5, 7).Value, Pos + 1) & "]" 39 40 'ExecuteExcel4Macroは過去の遺物(公式ドキュメントにもない)なのでなるべく使わない 41 '外部参照式の方が高速 42 WS.Range("E8").Formula = "=" & Target & "読み込みデータ'!D2" 'A Sample表示 43 WS.Range("E8").Value = WS.Range("E8").Value 44 WS.Range("E9").Formula = "=" & Target & "読み込みデータ'!D3" 'B Sample表示 45 WS.Range("E9").Value = WS.Range("E9").Value 46 WS.Range("C10").Formula = "=" & Target & "読み込みデータ'!D4" 'C Sample表示 47 WS.Range("C10").Value = WS.Range("C10").Value 48 WS.Range("E10").Formula = "=IF(" & Target & "読み込みデータ'!B6<>""""," & _ 49 Target & "読み込みデータ'!D6,""項目がありませんでした"")" 'D Sample表示" 50 WS.Range("E10").Value = WS.Range("E10").Value 51 WS.Range("G10").Formula = "=" & Target & "読み込みデータ'!D7" 'E Sample表示 52 WS.Range("G10").Value = WS.Range("G10").Value 53 WS.Range("I10").Formula = "=IF(" & Target & "読み込みデータ'!B9<>""""," & _ 54 Target & "読み込みデータ'!D9,""項目がありませんでした"")" 'F Sample表示" 55 WS.Range("I10").Value = WS.Range("I10").Value 56End Sub 57

投稿2020/08/19 14:34

hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qqkf

2020/08/19 15:29

コーディング並びに指摘ありがとうございました。 ExecuteExcel4Macroですが調べてると確かに推奨していない書き方でしたね。 これに頼ってしまいまだまだ勉強不足でした。 質問ですが、何で一つの型に対して複数宣言する場合は省略できないのでしょうか。 質問する前に自分でコーディングしたのは動いたのですが。
hatena19

2020/08/19 19:55

書き方が悪かったですね。VBAでは型宣言を省略するとVariant型になるということです。 他言語では複数の変数宣言を1行で書く時に最後以外は省略出来て最後に宣言した型になりますが、 VBAではそうなりません。 Variant型にはどんな型でも代入できますのでエラーになりませんが、実行速度が遅かったり、バグのもとになりますので、必要なとき以外は避けたほうがいいです。
qqkf

2020/08/20 12:13

VBAの型宣言には注意したいと思います。 最後にもう一つやりたいことがありまして、 画像2の項目(B列)の部分がもし絶対参照にした場合どうコーディングしたらよいでしょうか? 例えばB2がA SampleじゃないとD2(2.0000)を記載しない、それ以外は、該当項目なしと表現したいです。
hatena19

2020/08/20 12:41

そういった条件は最初にすべて出しておいてください。 後から出されると、場合によってはコードを最初から書きなす必要もでてきますので、労力が無駄になります。 多分、「絶対参照」という用語も誤解して使っている予感がします。 B Sample、C Sample ・・・も同様のことがしたいのですよね。 最終的にやりたいことを整理して質問を編集してください。 あるいは、現状の質問とはかなり違ったものになるなら、これは解決済みにして、新規に質問しなおした方がいいかもしれません。
qqkf

2020/08/20 12:49

すいません。 今回やりたいことができたので別の機会に整理してから質問したいと思います。
guest

0

画像2の「B6」と「B10」のセルが空かどうか条件判定してから、画像1の「E10」と「I10」のセルへ値を入れればいいのではないでしょうか。

具体的には、こんな感じです。

VBA

1'ExecuteExcel4Macroで読み込んでいるエクセルファイルをオープンさせない 2Range("E8") = ExecuteExcel4Macro(Target & "読み込みデータ'!R2C4") 'A Sample表示 3Range("E9") = ExecuteExcel4Macro(Target & "読み込みデータ'!R3C4") 'B Sample表示 4Range("C10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R4C4") 'C Sample表示 5If ExecuteExcel4Macro(Target & "読み込みデータ'!R6C2") <> "" Then 6 Range("E10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R6C4") 'D Sample表示 7Else 8 Range("E10") = "項目がありませんでした" 9End If 10Range("G10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R8C4") 'E Sample表示 11If ExecuteExcel4Macro(Target & "読み込みデータ'!R10C2") <> "" Then 12 Range("I10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R10C4") 'F Sample表示 13Else 14 Range("I10") = "項目がありませんでした" 15End If

投稿2020/08/19 14:09

ELBE

総合スコア305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qqkf

2020/08/19 15:13

コーディングありがとうございました。 条件式使いこなせるように学習したいと思います。
meg_

2020/08/19 15:21

「<> ""」で出来ましたか? Excel2013ではこの条件では動作しませんでした。
qqkf

2020/08/19 15:35

meg_さん こちらでも行ったのですが、動作しませんでした。 バージョンはExcel2016
ELBE

2020/08/20 03:17

<> "" が動作しないのであれば、下記のようにしてみてください。 If Not ExecuteExcel4Macro(Target & "読み込みデータ'!R6C2") = "" Then
guest

0

D Sampleの例です。

VBA

1If ExecuteExcel4Macro(Target & "読み込みデータ'!R6C4") <> 0 Then 2 Range("E10") = ExecuteExcel4Macro(Target & "読み込みデータ'!R6C4") 3Else 4 Range("E10") = "該当項目がありませんでした" 5End If

投稿2020/08/19 14:00

meg_

総合スコア10580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qqkf

2020/08/19 15:12

コーディングありがとうございました。 シンプルで助かりました。 条件分岐のもっと学習したいと思います。
meg_

2020/08/19 15:22

Excel2013で検証しました。実行できない場合は他の回答者の回答を参考になさってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問