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

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

新規登録して質問してみよう
ただいま回答率
85.35%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

2599閲覧

特定の条件のときは、データを転記しないマクロを作成したいが、条件が効かない

2134

総合スコア3

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2020/04/28 09:28

編集2020/05/04 16:47

前提・実現したいこと

ExcelファイルからExcelファイル(一覧)へデータを転記するプログラムを作成しました。
(複数の転記元ファイルのデータを、一覧ファイルへ1レコードとして転記)
特定の条件に合致するExcelファイルからはデータを転記しないようにしたいのですが、
実行しても、全てのExcelファイルからデータを転記してしまいます。

作成したソースコードを記載致しますので、知恵をお貸しください。
宜しくお願い致します。

【条件】
一覧ファイルのAQ列がNullの場合は、その該当の転記元ファイルは転記しないようにしたいです。

発生している問題・エラーメッセージ

**転記元ファイルのファイル名は「◯◯◯_aaa.xlsx」となっており(◯は固定値) aaaの部分を一覧のD列に転記しているため、これをキーにソースコードを作成したのですが、うまくいきません。**

該当のソースコード

VBA

1 2Option Explicit 3 4Dim mFSO As FileSystemObject 5 6Sub 一覧表更新() 7 Dim rngList As Range 8 Dim vrtSubjectList As Variant 9 10 Set mFSO = New FileSystemObject 11 12 '一覧表のセル範囲取得 13 Set rngList = ThisWorkbook.Worksheets("一覧").Range("A12").CurrentRegion 14 15 '空欄クリア 16 InitializeTable rngList 17 18 '一覧にないファイルのリストを取得 19 vrtSubjectList = Get_UpdatedSubjectList(rngList) 20 21 'データの転記 22 SetUpdated vrtSubjectList, rngList 23 24End Sub 25 26'一覧表中のAQ列が空欄の行をクリア 27Private Sub InitializeTable(ByRef rngList As Range) 28 Dim rngBlank As Range 29 30 With rngList 31 If rngList.Rows.Count > 1 Then 32 On Error Resume Next 33 Set rngBlank = rngList.Columns(43).SpecialCells(xlCellTypeBlanks) 34 On Error GoTo 0 35 If rngBlank Is Nothing Then Exit Sub 36 37 rngBlank.EntireRow.ClearContents 38 rngList.Sort Key1:=rngList(4), Order1:=xlAscending, Header:=xlYes 39 End If 40 Set rngList = rngList.CurrentRegion 41 End With 42End Sub 43 44'一覧表にないファイルのフルパスのリストを取得 45Private Function Get_UpdatedSubjectList(ByRef rngList As Range) As Variant 46 Dim WSF As WorksheetFunction 47 Dim myFolder As folder 48 Dim myFile As file 49 Dim strPath As String 50 Dim strBaseName, BaseName As String 51 Dim vrtOld As Variant 52 Dim vrtNewList() As Variant 53 Dim ix As Long 54 55 Dim intPos As Long 56 57 ReDim vrtNewList(1 To 50000) 58 Set WSF = Application.WorksheetFunction 59 '入力済み管理NOリスト 60 vrtOld = WSF.Transpose(rngList.Columns(4)) 61 62 strPath = ThisWorkbook.Path 63 64 For Each myFolder In mFSO.GetFolder(strPath).SubFolders 65 For Each myFile In myFolder.Files 66 BaseName = mFSO.GetBaseName(myFile.Path) 67 intPos = InStr(BaseName, "_") 68 strBaseName = Mid(BaseName, intPos + 1) 69 If IsError(Application.Match(strBaseName, vrtOld, 0)) Then 70 ix = ix + 1 71 vrtNewList(ix) = myFile.Path 72 End If 73 Next 74 Next 75 76 ReDim Preserve vrtNewList(1 To ix) 77 Get_UpdatedSubjectList = vrtNewList 78End Function 79 80'データの転記 81Private Sub SetUpdated(ByVal vrtSubjectList As Variant, ByRef rngList As Range) 82 Dim c As Range 83 Dim f As Variant 84 Dim strContent(1 To 66) As String 85 Dim ix As Long 86 Dim vrtNewList() As Variant 87 ReDim vrtNewList(LBound(vrtSubjectList) To UBound(vrtSubjectList), 1 To 66) 88 89 For Each f In vrtSubjectList 90 ix = ix + 1 91 With Workbooks.Open(f, UpdateLinks:=False, ReadOnly:=True) 92 vrtNewList(ix, 1) = .Worksheets("単票").Cells(10, 33).Value 93 94   __(※こちらは文字数の制限により、省略致します※)__ 95 96 vrtNewList(ix, 66) = .Worksheets("単票").Cells(2, 46).Value 97 98 .Close False 99 End With 100 Next 101 102 With rngList 103 Set rngList = .Cells(.Rows.Count, 2).Resize(UBound(vrtNewList, 1), UBound(vrtNewList, 2)) 104 End With 105 rngList.Value = vrtNewList 106 107End Sub 108 109 110 111

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

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

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

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

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

meg_

2020/04/28 09:48

「特定の条件に合致するExcelファイルからはデータを転記しない」の処理は上記コードのどのあたりで実装していますか?
2134

2020/04/28 10:11

すみません。記載すべきソースコードが漏れておりました。 ご指摘いただきありがとうございます。 1つ目のプロシージャで、AQ列がNullの行をクリア 2つ目のプロシージャで、一覧にないファイルを転記する 上記によって、AQ列がNullではない場合は、データを転記しないことを実現しようとしています。
meg_

2020/04/28 11:32

関数InitializeTableでデバッグはされましたか?コードを見たところ問題はなさそうですが。
2134

2020/05/04 16:53

ご回答いただきありがとうございます。 ソースコードの全文を記載致しました。 不十分な情報の中、ご回答をさせてしまいすみません。ありがとうございました。 デバックした結果、 > If IsError(Application.Match(strBaseName, vrtOld, 0)) Then ここでvrtOldに想定したデータが入っておらず、Emptyとなっているため、すべてのファイルのデータを転記してしまっているところまではわかりましたが、vrtOldに想定するデータを入れることができず、苦戦をしている状況です。。。
guest

回答2

0

vba

1vrtOld = WSF.Transpose(rngList.Columns(4))

の文ですが、なぜTransposeしているのでしょうか?
回答になっているかわかりませんが、Transposeなしで代入してみてはいかがでしょうか。

投稿2020/05/05 11:44

ryuno_vanilla

総合スコア119

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

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

0

ベストアンサー

If IsError(Application.Match(strBaseName, vrtOld, 0)) Then

↑ここでリストにあるかないかの存在確認をしているので、
そこの行にブレークポイントを置いて、実行をストップし、
変数の中身をローカルウィンドウ等で確認して、
正しく判定できているかどうか確認してみては?

strBaseName は、ファイルのベースネームを取得しているようですが、
vrtOldにはどんな値が入っているか回答側では確認できません。
拡張子が付いていたり、ファイルのフルパスであったりしたら、
当然存在しないと判定されます。

他人にデバッグを手伝ってもらうなら、時間がどれだけかかろうとも、
回答側でも動作確認ができるよう、シート上のイメージを提示したり、
コードを全文載せるべきでしょう。
そこを横着したら、欲しい情報が貰えないです。
とりあえず、
デバッグの仕方を勉強するなり質問したりした方が、
今後に有益かと思います。
あと、どの行が問題なのかさっぱり当たりが付かないようですが、
1行1行の意味を理解されているのでしょうか?
まずはステップ実行をしながら、一行一行理解されて、
変数の値がその時々で期待通りの値になっているのかを、
ローカルウィンドウで確認するところから始めてみてください。

↓参考サイト>>
プロパティ、メソッドの探り方 マクロ記録とF1のHelpを使う

投稿2020/04/28 11:50

mattuwan

総合スコア2163

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

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

2134

2020/05/04 16:49 編集

ソースコードを割愛し情報が不十分ということ、またあまりに自分で考えることをせず、ご質問してしまったこと、すみません。今後この質問に限らず、質問をする際に気をつけたいと思います。ご指摘をいただきありがとうございました。 いただいた情報から、試行錯誤を繰り返したのですが、時間をかけても修正できず、ご返信が遅くなったことも併せてすみません。 尚、記載のプログラムを修正致しました。転記処理は文字数の制限により、全部は記載できませんでしたが、他はすべて記載しております。 ----- デバックした結果、 > If IsError(Application.Match(strBaseName, vrtOld, 0)) Then ここで、キーとしている、strBaseNameは意図した通り、ファイル名の一部(「◯◯◯_aaa.xlsx」のaaaの部分)を取得できておりましたが、 vrtOldに想定したデータが入っておらず、Emptyとなっているため、すべてのファイルのデータを転記してしまっているところまではわかりました。 しかし、vrtOldに、一覧のうちAQ列がNullではないのレコードのD列データを入れることができておりません。(コードの意味は理解しているつもりです) 可能であれば、アドバイスをいただけませんでしょうか? 不躾なご質問を繰り返し、恐縮ですが宜しくお願い致します。
mattuwan

2020/05/06 22:56

>しかし、vrtOldに、一覧のうちAQ列がNullではないのレコードのD列データを入れることができておりません。(コードの意味は理解しているつもりです) >可能であれば、アドバイスをいただけませんでしょうか? 空白セルの値はNullではありません。Emptyです。 Emptyならば、 '入力済み管理NOリスト vrtOld = WSF.Transpose(rngList.Columns(4)) ↑で、止めて、 イミディエイトウィンドウで ?rngList.Columns(4).address(,,,true) [Enter] (※[Enter]はエンターキー押下の意) としてみたり、 ウオォッチウィンドウでウォッチ式を上記のようにいれて、 セルの範囲が意図したように正しく指定出来ているか、 確認してみてください。 時間がないので、詳しく見てませんが、 IsError(Application.Match(strBaseName, vrtOld, 0)) の第2引数は、現状、配列を指定してますが、 セル範囲でもいいので、他との関連でどっちがいいか判断できませんが、 セル範囲に変えてもいいかもしれません。
2134

2020/05/15 05:06

ご回答いただきありがとうございました。 ご回答いただいた内容を元に、試行錯誤を繰り返した結果、 > '一覧表のセル範囲取得 > Set rngList = ThisWorkbook.Worksheets("一覧").Range("A12").CurrentRegion にて正しくセル範囲を指定できていなかったようで(一覧に空白セルが混ざっているため?) セル範囲の指定を以下に変更することで、解消致しました。 > Set rngList = ThisWorkbook.Worksheets("一覧").Range(Cells(11, 1), Cells(Cells(Rows.Count, 4).End(xlUp).row, Cells(11, Columns.Count).End(xlToLeft).Column)) ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問