前提・実現したいこと
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
「特定の条件に合致するExcelファイルからはデータを転記しない」の処理は上記コードのどのあたりで実装していますか?
すみません。記載すべきソースコードが漏れておりました。
ご指摘いただきありがとうございます。
1つ目のプロシージャで、AQ列がNullの行をクリア
2つ目のプロシージャで、一覧にないファイルを転記する
上記によって、AQ列がNullではない場合は、データを転記しないことを実現しようとしています。
関数InitializeTableでデバッグはされましたか?コードを見たところ問題はなさそうですが。
ご回答いただきありがとうございます。
ソースコードの全文を記載致しました。
不十分な情報の中、ご回答をさせてしまいすみません。ありがとうございました。
デバックした結果、
> If IsError(Application.Match(strBaseName, vrtOld, 0)) Then
ここでvrtOldに想定したデータが入っておらず、Emptyとなっているため、すべてのファイルのデータを転記してしまっているところまではわかりましたが、vrtOldに想定するデータを入れることができず、苦戦をしている状況です。。。
回答2件
あなたの回答
tips
プレビュー