以下の「現状のソース」を実行すると、[現状の実行結果]のようになり、「月」が正しく転記されません。
そこで、以下の「実装内容」で新たにコードを修正しようと思うのですが、コードの書き方がわからずに困っています。。。
どのようにソースを書けば良いでしょうか、ご教授いただけると幸いです。
実装内容
C列が3でセル結合しているとき.MergeCellsがTrueの時に.MergeArea.Count = 3のとき
C列に「担当者」という文字列が入っているとき、「年月」の値をコピー先の行へ設定する。
C列が2でセル結合しているとき.MergeCellsがTrueの時に.MergeArea.Count = 2のとき
C列に文字列が入っているとき、[担当者][工数]の値をコピー先の行へ設定する。
[現状のソース]
Macro
1Sub sample1() 2 3 Dim lngRowsNo As Long ' 書きこむ位置(行) 4 Dim lngSheetIndex As Long ' シートの番号 5 Dim strFile As String ' Excelファイルの場所 6 Dim xlsAcq As New Excel.Application ' 取得側Excel 7 Dim wbAcq As Workbook ' 取得側Excelブック 8 Dim wsAcq As Worksheet ' 取得側Excelシート 9 Dim wsSet As Worksheet ' 設定側Excelシート 10 Const strPath As String = "/Users/keiichi/Desktop/マクロ宿題/" 11 Set wsSet = ActiveSheet 12 Dim i As Long 13 14 strFile = Dir(strPath & "*.xls") 15 lngRowsNo = 3 ' 書きこみ開始位置(行) 16 Do Until strFile = "" 17 '----- Excelブックを開く 18 Set wbAcq = Workbooks.Open(strPath & strFile) 19 20 '----- シートを検索 21 For lngSheetIndex = 1 To wbAcq.Worksheets.Count 22 '----- 「更新」シートを検索 23 If wbAcq.Worksheets(lngSheetIndex).Name = "最新" Then 24 '----- 「更新」シートを変数へ登録 25 26 Set wsAcq = wbAcq.Worksheets(lngSheetIndex) 27 '----- 「更新」シートの内容を現在のシートにコピー(自由に変更して下さい) 28 With wsAcq 29 Dim fname As String 'ファイル名 30 Dim n As Long 'ループで使用します。 31 Dim m As Long 'ループで使用します。 32 Dim ec1 As Long '各開発の一番下の担当者のセルを取得 33 Dim ec2 As Long '各開発の 月の一番右(最後)のセルを取得 34 Dim ec3 As Long '月数を取得 35 Dim ColumnNo As Long ' 転記先の列番号(初期値4) 36 Dim ColumnNo2 As Long ' 転記元の列番号(初期値5)+3されていく 37 38 ColumnNo = 4 39 ColumnNo2 = 5 40 41 For i = 1 To .UsedRange.Rows.Count 42 43 If (Left(.Cells(i, 2).Value, 2) = "A1" Or Left(.Cells(i, 2).Value, 2) = "B1" Or Left(.Cells(i, 2).Value, 2) = "C1") And .Cells(i, 2).MergeCells = False Then 44 45 '月を取得して転記 46 ec2 = .Cells(i + 1, 5).End(xlToRight).Column + 1 47 48 For col = 5 To ec2 49 50 '「担当者」の転記 51 wsSet.Cells(lngRowsNo - 1, 3).Value = .Cells(i + 1, 3).Value 52 53 '「担当者」以降の 「月」の転記 54 wsSet.Cells(lngRowsNo - 1, ColumnNo).Value = .Cells(i + 1, ColumnNo2).Value 55 56 ColumnNo = ColumnNo + 1 57 ColumnNo2 = ColumnNo2 + 3 58 59 Next col 60 61 ' ------ 開発〇から一番上の担当者のセル位置を相対的にCells(i + 3, 3)として取得し 62 'データの入っているところまでループさせる (その時、開発名を転記) 63 ec1 = .Cells(i + 3, 2).End(xlDown).Row 64 For n = i + 3 To ec1 65 66 '担当者が空白の時スキップする 67 If Cells(n, 3) = "" Then 68 GoTo NEXT99 69 End If 70 71 'ファイル名 72 fname = ActiveWorkbook.Name 73 wsSet.Cells(lngRowsNo, 1).Value = fname 74 If .MergeArea.Count = 4 Then 75 End If 76 'メソッドまたはデータメンバーが見つかりません 77 '開発 78 wsSet.Cells(lngRowsNo, 2).Value = .Cells(i, 2).Value 79 80 '担当者 81 wsSet.Cells(lngRowsNo, 3).Value = .Cells(n, 3).Value 82 83 '工数 84 wsSet.Cells(lngRowsNo, 4).Value = .Cells(n, 5).Value 85 86 wsSet.Cells(lngRowsNo, 5).Value = .Cells(n, 8).Value 87 88 wsSet.Cells(lngRowsNo, 6).Value = .Cells(n, 11).Value 89 90 wsSet.Cells(lngRowsNo, 7).Value = .Cells(n, 14).Value 91 92 wsSet.Cells(lngRowsNo, 8).Value = .Cells(n, 17).Value 93 94 wsSet.Cells(lngRowsNo, 9).Value = .Cells(n, 20).Value 95 96 wsSet.Cells(lngRowsNo, 10).Value = .Cells(n, 23).Value 97 98 wsSet.Cells(lngRowsNo, 11).Value = .Cells(n, 26).Value 99 100 wsSet.Cells(lngRowsNo, 12).Value = .Cells(n, 29).Value 101 102 wsSet.Cells(lngRowsNo, 13).Value = .Cells(n, 32).Value 103 104 '1行下へ 105 lngRowsNo = lngRowsNo + 1 106 107NEXT99: 108 Next n 109 110 End If 111 Next i 112 End With 113 114 '----- 検索の終了 115 Exit For 116 End If 117 Next lngSheetIndex 118 119 '----- シート参照の解放 120 Set wsAcq = Nothing 121 '----- ブックを閉じる 122 wbAcq.Close Savechanges:=False 123 124 '----- 次のファイルへ 125 strFile = Dir() 126 127 128 Loop 129 130 '----- Excelへの参照の解放 131 Set xlsAcq = Nothing 132 133 Dim maxrow As Long '最終行 134 maxrow = wsSet.Cells(Rows.Count, 3).End(xlUp).Row 'C列で最終行を求める 135 For i = 3 To maxrow 136 137 If wsSet.Cells(i, "C").Value = "担当者" Then 138 wsSet.Cells(i, "A").Value = "" 139 wsSet.Cells(i, "B").Value = "" 140 End If 141 Next 142 143End Sub 144
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 03:33
2020/09/27 03:36
2020/09/27 03:42 編集
2020/09/27 03:50
2020/09/27 03:57
回答7件
0
ベストアンサー
年月は偶然ですが工数とおんなじ列に値があります。
その為処理は似通ってきますが下記ソースのように記載下さい。
後調整で
- コメントの追記
- エラー時処理(エラーの時メッセージが表示されます)
- 終了時の処理(Excelを使った後は必ず必要です。こう書いておく物と覚えていただけたらで構いません)
を行っています
VBA
1Public Sub sample1() 2'------------------------------------------------------------------------------- 3' sample1 4' 説明 5' コピー元のEcxelシート内[更新]シートから内容をコピーする 6' パラメータ 7' なし 8' 戻り値 9' なし 10'------------------------------------------------------------------------------- 11 12 Dim strFromXMLFileName As String ' コピー元となるExcelファイルの名前 13 Dim xlsFrom As New Excel.Application ' 取得側Excel 14 Dim wbFrom As Workbook ' 取得側Excelブック 15 Dim wsFrom As Worksheet ' 取得側Excelシート 16 Dim lngFromSheetNo As Long ' 検索するシートの番号 17 Dim lngFromRowsNo As Long ' 検索する行位置 18 19 Dim wsTo As Worksheet ' 設定側Excelシート 20 Dim lngToRowsNo As Long ' 書きこむ行位置 21 Dim varKaihatsu As Variant ' [開発]の値 22 23 Const strDefaultPath As String = "パスを指定する" 'コピー元となるExcelファイルが置いてあるフォルダのパス(\で終わる事) 24 25On Error GoTo sample1_Error: 26 27 ' コピー先の設定 28 Set wsTo = ActiveSheet ' 書きこむシートは今開いているシート 29 ' 1. コピー先の開始行は2行目から開始とする。 30 lngToRowsNo = 2 ' 書きこむ行位置2行目から 31 32 ' コピー元となるExcelファイルが置いてあるフォルダのパスからExcelファイルを検索する 33 strFromXMLFileName = Dir(strDefaultPath & "*.xls") 34 35 ' Excelファイルが見つからなくなるまで検索 36 Do Until strFromXMLFileName = "" 37 38 ' 見つかったExcelブックを開く 39 Set wbFrom = Workbooks.Open(strDefaultPath & strFromXMLFileName) 40 41 ' 見つかったExcelブックのシートを順番に検索(登録があるシートすべて) 42 For lngFromSheetNo = 1 To wbFrom.Worksheets.Count 43 44 ' シート名が"更新"のシートを検索 45 If wbFrom.Worksheets(lngFromSheetNo).Name = "更新" Then 46 47 ' コピー元のシートを設定 48 Set wsFrom = wbFrom.Worksheets(lngFromSheetNo) 49 50 ' 2. コピー元のシートを1行目から検索(登録がある行すべて) 51 For lngFromRowsNo = 1 To wsFrom.UsedRange.Rows.Count 52 53 If wsFrom.Cells(lngFromRowsNo, 3).MergeCells = True Then 54 ' C列=3 が結合セルの場合 55 Select Case wsFrom.Cells(lngFromRowsNo, 3).MergeArea.Count 56 Case 4 57 ' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 58 If wsFrom.Cells(lngFromRowsNo, 3).Value = "担当者" Then 59 ' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 60 wsTo.Cells(lngToRowsNo, 3).Value = "担当者" 'C列←"担当者" 61 wsTo.Cells(lngToRowsNo, 4).Value = wsFrom.Cells(lngFromRowsNo, 5).Value 'D列←E列[年月]1 62 wsTo.Cells(lngToRowsNo, 5).Value = wsFrom.Cells(lngFromRowsNo, 8).Value 'E列←H列[年月]2 63 wsTo.Cells(lngToRowsNo, 6).Value = wsFrom.Cells(lngFromRowsNo, 11).Value 'F列←K列[年月]3 64 wsTo.Cells(lngToRowsNo, 7).Value = wsFrom.Cells(lngFromRowsNo, 14).Value 'G列←N列[年月]4 65 wsTo.Cells(lngToRowsNo, 8).Value = wsFrom.Cells(lngFromRowsNo, 17).Value 'H列←Q列[年月]5 66 wsTo.Cells(lngToRowsNo, 9).Value = wsFrom.Cells(lngFromRowsNo, 20).Value 'I列←T列[年月]6 67 wsTo.Cells(lngToRowsNo, 10).Value = wsFrom.Cells(lngFromRowsNo, 23).Value 'J列←W列[年月]7 68 wsTo.Cells(lngToRowsNo, 11).Value = wsFrom.Cells(lngFromRowsNo, 26).Value 'K列←Z列[年月]8 69 wsTo.Cells(lngToRowsNo, 12).Value = wsFrom.Cells(lngFromRowsNo, 29).Value 'L列←AC列[年月]9 70 wsTo.Cells(lngToRowsNo, 13).Value = wsFrom.Cells(lngFromRowsNo, 32).Value 'M列←AF列[年月]10 71' wsTo.Cells(lngToRowsNo, 14).Value = wsFrom.Cells(lngFromRowsNo, 35).Value 'O列←AI列[年月]11 72' wsTo.Cells(lngToRowsNo, 15).Value = wsFrom.Cells(lngFromRowsNo, 38).Value 'P列←AL列[年月]12 73 74 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 75 lngToRowsNo = lngToRowsNo + 1 76 End If 77 78 Case 2 79 ' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 80 If IsNull(wsFrom.Cells(lngFromRowsNo, 3).Value) = False And wsFrom.Cells(lngFromRowsNo, 3).Value <> "" Then 81 ' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 82 wsTo.Cells(lngToRowsNo, 1).Value = strFromXMLFileName 'A列←ファイル名 83 wsTo.Cells(lngToRowsNo, 2).Value = varKaihatsu 'B列←開発 84 wsTo.Cells(lngToRowsNo, 3).Value = wsFrom.Cells(lngFromRowsNo, 3).Value 'C列←C列[担当者] 85 wsTo.Cells(lngToRowsNo, 4).Value = wsFrom.Cells(lngFromRowsNo, 5).Value 'D列←E列[工数]1 86 wsTo.Cells(lngToRowsNo, 5).Value = wsFrom.Cells(lngFromRowsNo, 8).Value 'E列←H列[工数]2 87 wsTo.Cells(lngToRowsNo, 6).Value = wsFrom.Cells(lngFromRowsNo, 11).Value 'F列←K列[工数]3 88 wsTo.Cells(lngToRowsNo, 7).Value = wsFrom.Cells(lngFromRowsNo, 14).Value 'G列←N列[工数]4 89 wsTo.Cells(lngToRowsNo, 8).Value = wsFrom.Cells(lngFromRowsNo, 17).Value 'H列←Q列[工数]5 90 wsTo.Cells(lngToRowsNo, 9).Value = wsFrom.Cells(lngFromRowsNo, 20).Value 'I列←T列[工数]6 91 wsTo.Cells(lngToRowsNo, 10).Value = wsFrom.Cells(lngFromRowsNo, 23).Value 'J列←W列[工数]7 92 wsTo.Cells(lngToRowsNo, 11).Value = wsFrom.Cells(lngFromRowsNo, 26).Value 'K列←Z列[工数]8 93 wsTo.Cells(lngToRowsNo, 12).Value = wsFrom.Cells(lngFromRowsNo, 29).Value 'L列←AC列[工数]9 94 wsTo.Cells(lngToRowsNo, 13).Value = wsFrom.Cells(lngFromRowsNo, 32).Value 'M列←AF列[工数]10 95' wsTo.Cells(lngToRowsNo, 14).Value = wsFrom.Cells(lngFromRowsNo, 35).Value 'O列←AI列[工数]11 96' wsTo.Cells(lngToRowsNo, 15).Value = wsFrom.Cells(lngFromRowsNo, 38).Value 'P列←AL列[工数]12 97 98 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 99 lngToRowsNo = lngToRowsNo + 1 100 End If 101 102 End Select 103 Else 104 ' C列=3 が結合セルでない場合 105 Select Case Left(wsFrom.Cells(lngFromRowsNo, 2).Value, 2) 'B列=2 左から2文字を取得 106 Case "A1", "A2", "A3" 107 ' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 108 varKaihatsu = wsFrom.Cells(lngFromRowsNo, 2).Value ' [開発]の値 109 End Select 110 End If 111 112 Next lngFromRowsNo 113 114 ' 1つのExcelファイルには同じ名前のシートが作成できないのでシート検索処理を終了する 115 Exit For 116 117 End If 118 119 Next lngFromSheetNo 120 121 ' 見つかったExcelブックを閉じる 122 Call wbFrom.Close(True) 'セーブはしない 123 Set wbFrom = Nothing '参照の解除 124 125 ' 次のExcelファイルを検索 126 strFromXMLFileName = Dir() 127 Loop 128 129sample1_End: 130On Error Resume Next 131 ' 終了処理 132 ' 取得側Excelシート 133 Set wsFrom = Nothing '参照の解除 134 ' 取得側Excelブック 135 Call wbFrom.Close(True) 'セーブはしない 136 Set wbFrom = Nothing '参照の解除 137 ' 取得側Excel 138 xlsFrom.Quit 'Excelを閉じる 139 Set xlsFrom = Nothing '参照の解除 140Exit Sub 141 142'----- エラー処理 143sample1_Error: 144 Call MsgBox("ErrNo:" & Err & vbNewLine & Error, vbOKOnly + vbCritical, "sample1") 145Resume sample1_End: 146End Sub 147 148 149
投稿2020/09/27 14:43
総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 14:49
2020/09/27 14:56
2020/09/27 15:09
0
質問者様この今の状態が大切なのです
今
- 質問者様はやりたい処理が明確になっている。
- きちんと清書した動くコードがある。
- 不明点(セルの結合がいくつか?)が明確である。
この状態で質問していただけたら回答はすぐにつきます。
下に質問の参考例を記載します。
エクセルのシート間の値のコピー処理で
一部どうやって判断したらよいかわからず困っています。
実現したいこと
このような手順で処理を行っていこうと考えています。
1行目 B列値が入力されていない。C列結合なし。
→無処理
...
13行目 B列値が入力されていない。C列結合なし。
→無処理
14行目 B列に"A1"が記載
→[開発]の値として変数に代入する
15行目 C列に「担当者」が記載
→4セル結合で"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。
16行目 C列に「担当者」が記載
→4セル結合だがC列には値が入っていないので無処理
17~28行目 C列に各担当者が記載(空白の際はスキップ)
→2セル結合なのでC列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。
29~31行目
→3セル結合なので無処理
32行目 B列C列にB1が記載
→[開発]の値として変数に代入する
33 C列に「担当者」が記載
→4セル結合で"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。
34行目 C列D列に「担当者」が記載
→4セル結合だがC列には値が入っていないので無処理
...
以降繰り返し
困っている事
ただ上記にある「セルの結合」の判断をどうしたら行えるかが判りません。
もしセルの結合以外で判断できるならたの方法でもかましません。
現在まで完成しているコード
VBA
1Public Sub sample1() 2'------------------------------------------------------------------------------- 3' sample1 4' 説明 5' コピー元のEcxelシート内[更新]シートから内容をコピーする 6' パラメータ 7' なし 8' 戻り値 9' なし 10'------------------------------------------------------------------------------- 11 12 Dim strFromXMLFileName As String ' コピー元となるExcelファイルの名前 13 Dim xlsFrom As New Excel.Application ' 取得側Excel 14 Dim wbFrom As Workbook ' 取得側Excelブック 15 Dim wsFrom As Worksheet ' 取得側Excelシート 16 Dim lngFromSheetNo As Long ' 検索するシートの番号 17 Dim lngFromRowsNo As Long ' 検索する行位置 18 19 Dim wsTo As Worksheet ' 設定側Excelシート 20 Dim lngToRowsNo As Long ' 書きこむ行位置 21 Dim varKaihatsu As Variant ' [開発]の値 22 23 Const strDefaultPath As String = "パスを指定する" 'コピー元となるExcelファイルが置いてあるフォルダのパス(\で終わる事) 24 25On Error GoTo sample1_Error: 26 27 ' コピー先の設定 28 Set wsTo = ActiveSheet ' 書きこむシートは今開いているシート 29 ' 1. コピー先の開始行は2行目から開始とする。 30 lngToRowsNo = 2 ' 書きこむ行位置2行目から 31 32 ' コピー元となるExcelファイルが置いてあるフォルダのパスからExcelファイルを検索する 33 strFromXMLFileName = Dir(strDefaultPath & "*.xls") 34 35 ' Excelファイルが見つからなくなるまで検索 36 Do Until strFromXMLFileName = "" 37 38 ' 見つかったExcelブックを開く 39 Set wbFrom = Workbooks.Open(strDefaultPath & strFromXMLFileName) 40 41 ' 見つかったExcelブックのシートを順番に検索(登録があるシートすべて) 42 For lngFromSheetNo = 1 To wbFrom.Worksheets.Count 43 44 ' シート名が"更新"のシートを検索 45 If wbFrom.Worksheets(lngFromSheetNo).Name = "更新" Then 46 47 ' コピー元のシートを設定 48 Set wsFrom = wbFrom.Worksheets(lngFromSheetNo) 49 50 ' 2. コピー元のシートを1行目から検索(登録がある行すべて) 51 For lngFromRowsNo = 1 To wsFrom.UsedRange.Rows.Count 52 Select Case Left(wsFrom.Cells(lngFromRowsNo, 2).Value) 'B列=2 左から2文字を取得 53 Case "A1", "A2", "A3" 54 ' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 55 varKaihatsu = wsFrom.Cells(lngFromRowsNo, 2).Value ' [開発]の値 56 End Select 57 58 ' 4. C列が4セル結合している場合 59 60 ' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 61 62 ' 5. C列が2セル結合している場合 63 64 ' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 65 66 Next lngFromRowsNo 67 68 ' 1つのExcelファイルには同じ名前のシートが作成できないのでシート検索処理を終了する 69 Exit For 70 71 End If 72 73 Next lngFromSheetNo 74 75 ' 見つかったExcelブックを閉じる 76 Call wbFrom.Close(True) 'セーブはしない 77 Set wbFrom = Nothing '参照の解除 78 79 ' 次のExcelファイルを検索 80 strFromXMLFileName = Dir() 81 Loop 82 83sample1_End: 84On Error Resume Next 85Exit Sub 86 87'----- エラー処理 88sample1_Error: 89Resume sample1_End: 90End Sub 91
投稿2020/09/27 09:32
編集2020/09/27 11:40総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 09:34
2020/09/27 09:37
0
質問に対して回答します。
まず「セル結合」に関しては".MergeCells"がtrueかで判定できます。
この場合
VBA
1If wsFrom.Cells(lngFromRowsNo, 3).MergeCells = True Then
このような書き方となります。
また「セル結合」に関しては".MergeArea.Count"で確認することができます。
VBA
1Select Case wsFrom.Cells(lngFromRowsNo, 3).MergeArea.Count
一応".MergeCells"で判定後IF文を分けて".MergeArea.Count"を検索下さい
(エラーになる可能性があります)
あと質問者様のソースで2点ばかり気になった点があったので修正してみました
1点目. B列に"A1"or"B1"or"C1"で始まる文字列がある場合
参考資料を拝見すると15行目以降にも値が入っているご様子。
条件にC列が結合されていない場合を追加しました。
2点目. "Select Case " 文をご存じな様に見受けられました。
これは繰り返しIFをかかなくてても良い書き方となります。
コードが見やすくなるかと思い修正しました。
確認のほどよろしくお願いします。
追記
「セル結合」した場合例として"A1:B2"の4セル結合の場合、値が取得できるのは左上の"A1"が含まれている時のみとなります。("A2","B1","B2"では取得できない)
VBA
1Public Sub sample1() 2'------------------------------------------------------------------------------- 3' sample1 4' 説明 5' コピー元のEcxelシート内[更新]シートから内容をコピーする 6' パラメータ 7' なし 8' 戻り値 9' なし 10'------------------------------------------------------------------------------- 11 12 Dim strFromXMLFileName As String ' コピー元となるExcelファイルの名前 13 Dim xlsFrom As New Excel.Application ' 取得側Excel 14 Dim wbFrom As Workbook ' 取得側Excelブック 15 Dim wsFrom As Worksheet ' 取得側Excelシート 16 Dim lngFromSheetNo As Long ' 検索するシートの番号 17 Dim lngFromRowsNo As Long ' 検索する行位置 18 19 Dim wsTo As Worksheet ' 設定側Excelシート 20 Dim lngToRowsNo As Long ' 書きこむ行位置 21 Dim varKaihatsu As Variant ' [開発]の値 22 23 Const strDefaultPath As String = "パスを指定する" 'コピー元となるExcelファイルが置いてあるフォルダのパス(\で終わる事) 24 25On Error GoTo sample1_Error: 26 27 ' コピー先の設定 28 Set wsTo = ActiveSheet ' 書きこむシートは今開いているシート 29 ' 1. コピー先の開始行は2行目から開始とする。 30 lngToRowsNo = 2 ' 書きこむ行位置2行目から 31 32 ' コピー元となるExcelファイルが置いてあるフォルダのパスからExcelファイルを検索する 33 strFromXMLFileName = Dir(strDefaultPath & "*.xls") 34 35 ' Excelファイルが見つからなくなるまで検索 36 Do Until strFromXMLFileName = "" 37 38 ' 見つかったExcelブックを開く 39 Set wbFrom = Workbooks.Open(strDefaultPath & strFromXMLFileName) 40 41 ' 見つかったExcelブックのシートを順番に検索(登録があるシートすべて) 42 For lngFromSheetNo = 1 To wbFrom.Worksheets.Count 43 44 ' シート名が"更新"のシートを検索 45 If wbFrom.Worksheets(lngFromSheetNo).Name = "更新" Then 46 47 ' コピー元のシートを設定 48 Set wsFrom = wbFrom.Worksheets(lngFromSheetNo) 49 50 ' 2. コピー元のシートを1行目から検索(登録がある行すべて) 51 For lngFromRowsNo = 1 To wsFrom.UsedRange.Rows.Count 52 53 ' C列=3 が結合セルの場合 54 If wsFrom.Cells(lngFromRowsNo, 3).MergeCells = True Then 55 Select Case wsFrom.Cells(lngFromRowsNo, 3).MergeArea.Count 56 Case 4 57 ' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 58 If wsFrom.Cells(lngFromRowsNo, 3).Value = "担当者" Then 59 ' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 60 61 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 62 lngToRowsNo = lngToRowsNo + 1 63 End If 64 65 Case 2 66 ' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 67 If IsNull(wsFrom.Cells(lngFromRowsNo, 3).Value) = False And wsFrom.Cells(lngFromRowsNo, 3).Value <> "" Then 68 ' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 69 70 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 71 lngToRowsNo = lngToRowsNo + 1 72 End If 73 End Select 74 Else 75 Select Case Left(wsFrom.Cells(lngFromRowsNo, 2).Value, 2) 'B列=2 左から2文字を取得 76 Case "A1", "A2", "A3" 77 ' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 78 varKaihatsu = wsFrom.Cells(lngFromRowsNo, 2).Value ' [開発]の値 79 End Select 80 End If 81 82 Next lngFromRowsNo 83 84 ' 1つのExcelファイルには同じ名前のシートが作成できないのでシート検索処理を終了する 85 Exit For 86 87 End If 88 89 Next lngFromSheetNo 90 91 ' 見つかったExcelブックを閉じる 92 Call wbFrom.Close(True) 'セーブはしない 93 Set wbFrom = Nothing '参照の解除 94 95 ' 次のExcelファイルを検索 96 strFromXMLFileName = Dir() 97 Loop 98 99sample1_End: 100On Error Resume Next 101Exit Sub 102 103'----- エラー処理 104sample1_Error: 105Resume sample1_End: 106End Sub
投稿2020/09/27 09:45
編集2020/09/27 10:07総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 09:50
2020/09/27 09:56
2020/09/27 09:58
2020/09/27 10:03
2020/09/27 10:31
2020/09/27 10:37 編集
2020/09/27 10:40
2020/09/27 11:15 編集
2020/09/27 11:36 編集
2020/09/27 11:40
2020/09/27 11:44 編集
2020/09/27 11:46
2020/09/27 11:47
2020/09/27 11:49
2020/09/27 11:51
2020/09/27 12:23
2020/09/27 12:29
2020/09/27 12:37
2020/09/27 12:39
2020/09/27 12:42
2020/09/27 12:43
2020/09/27 13:13 編集
2020/09/27 13:16
2020/09/27 13:20
2020/09/27 13:23
2020/09/27 13:24
2020/09/27 13:30
2020/09/27 13:33 編集
2020/09/27 13:33
2020/09/27 13:34
2020/09/27 13:40
2020/09/27 13:46
2020/09/27 13:49 編集
2020/09/27 13:51
2020/09/27 13:56
2020/09/27 14:04
2020/09/27 14:04
2020/09/27 14:05
2020/09/27 14:06
2020/09/27 14:11
2020/09/27 14:12
2020/09/27 14:13
2020/09/27 14:14
2020/09/27 14:16
2020/09/27 14:25
2020/09/27 14:28
2020/09/27 14:33
2020/09/27 14:35
2020/09/27 14:38
2020/09/27 14:43
0
先の回答と同じ内容です。
現在できている部分は○を付けておきます。
これは私が導きだした手順です。
質問者様はこの内容が「私が回答」したから盲目的に正しいと思っていませんか?もしかして間違っているかもしれません。
コピー元シートを1行目から検索していってどう判定さていくか書き出してみてください。
例 13行目までは書いておきます。
1行目 B列C列に値が入力されていない
→無処理
...
13行目 B列C列に値が入力されていない
→無処理
○_1. コピー先の開始行は2行目から開始とする。
○_2. コピー元のシートを1行目から検索
○_3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。
_4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合)
__4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。
_5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合)
__5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。
○※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動
投稿2020/09/27 08:14
総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 08:24
2020/09/27 08:26
2020/09/27 08:28 編集
2020/09/27 08:30 編集
2020/09/27 08:31
2020/09/27 08:34
2020/09/27 08:35
2020/09/27 08:43
2020/09/27 09:00
2020/09/27 09:05
2020/09/27 09:10
2020/09/27 09:15
2020/09/27 09:16
2020/09/27 09:18
0
先ほどの回答と同じ内容です
※変数名がlngFromSheetIndexだと適切ではないでlngFromSheetNoに変更だけしています。
コメントで
'***** ここから
'***** ここまで
と書かれている箇所が今回私が回答した内容です。
一部に関してはいままで質問者様が書かれてたソースコードで書くことができます。
書けないところはコメントのままで良いのでVBAに変換できる箇所を
ここの部分だけで構いませんので返答下さい。
VBA
1Public Sub sample1() 2'------------------------------------------------------------------------------- 3' sample1 4' 説明 5' コピー元のEcxelシート内[更新]シートから内容をコピーする 6' パラメータ 7' なし 8' 戻り値 9' なし 10'------------------------------------------------------------------------------- 11 12 Dim strFromXMLFileName As String ' コピー元となるExcelファイルの名前 13 Dim xlsFrom As New Excel.Application ' 取得側Excel 14 Dim wbFrom As Workbook ' 取得側Excelブック 15 Dim wsFrom As Worksheet ' 取得側Excelシート 16 Dim lngFromSheetNo As Long ' 検索するシートの番号 17 Dim lngFromRowsNo As Long ' 検索する行位置 18 19 Dim wsTo As Worksheet ' 設定側Excelシート 20 Dim lngToRowsNo As Long ' 書きこむ行位置 21 22 Const strDefaultPath As String = "パスを指定する" 'コピー元となるExcelファイルが置いてあるフォルダのパス(\で終わる事) 23 24On Error GoTo sample1_Error: 25 26 ' コピー先の設定 27 Set wsTo = ActiveSheet ' 書きこむシートは今開いているシート 28 ' 1. コピー先の開始行は2行目から開始とする。 29 lngToRowsNo = 2 ' 書きこむ行位置2行目から 30 31 ' コピー元となるExcelファイルが置いてあるフォルダのパスからExcelファイルを検索する 32 strFromXMLFileName = Dir(strDefaultPath & "*.xls") 33 34 ' Excelファイルが見つからなくなるまで検索 35 Do Until strFromXMLFileName = "" 36 37 ' 見つかったExcelブックを開く 38 Set wbFrom = Workbooks.Open(strDefaultPath & strFromXMLFileName) 39 40 ' 2. コピー元のシートを1行目から検索 41 ' 見つかったExcelブックのシートを順番に検索(登録があるシートすべて) 42 For lngFromSheetNo = 1 To wbFrom.Worksheets.Count 43 44 ' シート名が"更新"のシートを検索 45 If wbFrom.Worksheets(lngFromSheetNo).Name = "更新" Then 46 47 ' コピー元のシートを設定 48 Set wsFrom = wbFrom.Worksheets(lngFromSheetNo) 49 50 '***** ここから 51 ' 2. コピー元のシートを1行目から検索 52 53 ' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 54 55 ' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 56 57 ' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 58 59 ' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 60 61 ' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 62 63 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 64 '***** ここまで 65 66 End If 67 68 Next lngFromSheetNo 69 70 ' 見つかったExcelブックを閉じる 71 Call wbFrom.Close(True) 'セーブはしない 72 Set wbFrom = Nothing '参照の解除 73 74 ' 次のExcelファイルを検索 75 strFromXMLFileName = Dir() 76 Loop 77 78sample1_End: 79On Error Resume Next 80Exit Sub 81 82'----- エラー処理 83sample1_Error: 84Resume sample1_End: 85End Sub
追記1
質問者様の返答内容を記載します。
(追記・編集依頼ですと表示が崩れる為)
VBA
1'***** ここから 2' 2. コピー元のシートを1行目から検索 3For lngFromSheetIndex = 1 To .UsedRange.Rows.Count 4'※なぜlngFromSheetIndexなのですか?変数は用意していますよね? 5'※.UsedRange.Rows.Countに関いて省略して書かない。 6 7' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、またはセルが結合されていない場合、[開発]の値として変数に代入しておく。 8If (Left(.Cells(i, 2).Value, 2) = "A1" Or Left(.Cells(i, 2).Value, 2) = "B1" Or Left(.Cells(i, 2).Value, 2) = "C1") And .Cells(i, 2).MergeCells = False Then 9'※セルの参照でなぜi変数を使っているのですか? 10'ただ不要な条件があります。 11 12End If 13' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 14 15' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 16 17' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 18 19' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 20 21' コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 22lngRowsNo = lngRowsNo + 1 23' ※なぜlngRowsNoなのですか?変数は用意済みですよね? 24Next i 25 26'***** ここまで 27
追記2
質問者様の返答内容を記載します。
VBA
1'***** ここから 2' 2. コピー元のシートを1行目から検索 3For lngFromRowsNo = 1 To .UsedRange.Rows.Count 4'※.UsedRange.Rows.Countは省略しない!直っていません 5 6' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 7If (Left(.Cells(lngFromRowsNo, 2).Value, 2) = "A1" Or Left(.Cells(lngFromRowsNo, 2).Value, 2) = "B1" Or Left(.Cells(lngFromRowsNo, 2).Value, 2) = "C1") Then 8'訂正.Cells( は省略しない 9 10End If 11' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 12 13' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 14 15' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 16 17' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 18 19' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 20lngRowsNo = lngRowsNo + 1 21'※ここもなぜ変数lngRowsNoなんですか?直っていません 22 23Next i 24'※追加 ここの変数名もおかしいですよね? 25 26'***** ここまで
投稿2020/09/27 06:24
編集2020/09/27 07:34総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 06:48
2020/09/27 07:02 編集
2020/09/27 07:06
2020/09/27 07:11 編集
2020/09/27 07:11
2020/09/27 07:17
2020/09/27 07:22
2020/09/27 07:23
2020/09/27 07:26 編集
2020/09/27 07:26
2020/09/27 07:32
2020/09/27 07:35
2020/09/27 07:46
2020/09/27 07:55 編集
2020/09/27 08:04
2020/09/27 08:07
2020/09/27 08:08
0
まずは質問者者様が書かれていた先で説明する以前の内容を清書しました。
コメントだらけになりますが、この様に初めははやりたい処理を日本語で書いて
それに合わせてコードを書き足します。
まずは処理自体は変わっていませんので以前の内容と比べてみてみて下さい。
(※エラートラップだけ追加しています)
VBA
1Public Sub sample1() 2'------------------------------------------------------------------------------- 3' sample1 4' 説明 5' コピー元のEcxelシート内[更新]シートから内容をコピーする 6' パラメータ 7' なし 8' 戻り値 9' なし 10'------------------------------------------------------------------------------- 11 12 Dim strFromXMLFileName As String ' コピー元となるExcelファイルの名前 13 Dim xlsFrom As New Excel.Application ' 取得側Excel 14 Dim wbFrom As Workbook ' 取得側Excelブック 15 Dim wsFrom As Worksheet ' 取得側Excelシート 16 Dim lngFromSheetIndex As Long ' 検索するシートの番号 17 Dim lngFromRowsNo As Long ' 検索する行位置 18 19 Dim wsTo As Worksheet ' 設定側Excelシート 20 Dim lngToRowsNo As Long ' 書きこむ行位置 21 22 Const strDefaultPath As String = "パスを指定する" 'コピー元となるExcelファイルが置いてあるフォルダのパス(\で終わる事) 23 24On Error GoTo sample1_Error: 25 26 ' コピー先の設定 27 Set wsTo = ActiveSheet ' 書きこむシートは今開いているシート 28 ' 1. コピー先の開始行は2行目から開始とする。 29 lngToRowsNo = 2 ' 書きこむ行位置2行目から 30 31 ' コピー元となるExcelファイルが置いてあるフォルダのパスからExcelファイルを検索する 32 strFromXMLFileName = Dir(strDefaultPath & "*.xls") 33 34 ' Excelファイルが見つからなくなるまで検索 35 Do Until strFromXMLFileName = "" 36 37 ' 見つかったExcelブックを開く 38 Set wbFrom = Workbooks.Open(strDefaultPath & strFromXMLFileName) 39 40 41 ' 見つかったExcelブックのシートを順番に検索 42 For lngFromSheetIndex = 1 To wbFrom.Worksheets.Count 43 44 ' シート名が"更新"のシートを検索 45 If wbFrom.Worksheets(lngFromSheetIndex).Name = "更新" Then 46 47 ' コピー元のシートを設定 48 Set wsFrom = wbFrom.Worksheets(lngFromSheetIndex) 49 50 ' 2. コピー元のシートを1行目から検索 51 ' 3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。 52 53 ' 4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合) 54 55 ' 4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。 56 57 ' 5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合) 58 59 ' 5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。 60 61 ' ※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動 62 63 End If 64 65 Next lngFromSheetIndex 66 67 ' 見つかったExcelブックを閉じる 68 Call wbFrom.Close(True) 'セーブはしない 69 Set wbFrom = Nothing '参照の解除 70 71 ' 次のExcelファイルを検索 72 strFromXMLFileName = Dir() 73 Loop 74 75sample1_End: 76On Error Resume Next 77Exit Sub 78 79'----- エラー処理 80sample1_Error: 81Resume sample1_End: 82End Sub 83
投稿2020/09/27 04:51
編集2020/09/27 10:11総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 05:05
2020/09/27 05:09
2020/09/27 05:20
2020/09/27 05:26
2020/09/27 05:30
2020/09/27 05:32 編集
2020/09/27 05:38
2020/09/27 05:44
2020/09/27 05:51
2020/09/27 05:53
2020/09/27 05:58
2020/09/27 06:01
2020/09/27 06:09
2020/09/27 06:17
2020/09/27 06:21
2020/09/27 06:43
2020/09/27 06:46
2020/09/27 06:48
0
先の回答にも書きましたがまず日本語で自分がコピー元の情報をどうやって見ているのかを日本語で書きだします。
ますは
A. 手順のおさらいです①
コピー元の情報は上の1行目から順番に検索していきます
1行目、2行目、3行目、...
で次にそこに何か書かれているか?で処理の判断を行います。
B. 手順のおさらいです②
何か書かれているか?が判ればどこから値を取得すればよいかが判ります。
C. 手順のおさらいです③
値が取得できたらコピー先のシートに情報を書きこみます。
この際行に追加していきますので書きこむと位置が1行ずれます。
まずここまでは理解できますか?
無かったらコメントに書いてください。
つぎに上の内容をもう少し具体的に書いたのが下の手順です。
_1. コピー先の開始行は2行目から開始とする。
_2. コピー元のシートを1行目から検索
_3. B列に"A1"or"B1"or"C1"で始まる文字列がある場合、[開発]の値として変数に代入しておく。
_4. C列が4セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 4 の場合)
__4.1. C列に"担当者"という文字列が入っている場合、表のヘッダーとして[年月]の値をコピー先の行へ設定する。
_5. C列が2セル結合している場合(.MergeCellsがTrueの時に.MergeArea.Count = 2 の場合)
__5.1. C列に文字列が入っている場合、表の明細として[担当者][工数]の値をコピー先の行へ設定する。
※コピー先の行へ設定した場合追加なので、コピー先は次の行へ移動
これは理解できましたか?理解できないならその点をコメントして下さい。
投稿2020/09/27 03:57
編集2020/09/27 04:02総合スコア2506
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/27 04:06 編集
2020/09/27 04:08
2020/09/27 04:09
2020/09/27 04:12
2020/09/27 04:15
2020/09/27 04:19
2020/09/27 04:22
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。