Excel VBA 質問スレッド №2053 (解決済)

Excelの複数sheetの一括加工

投稿者 : 焼きそば     投稿日時 : 2024/11/28(Thu) 12:02:17     OS : 未指定     EXCEL : 未指定
Excelのマクロ初心者です。
質問させていただきますので、どなたかご教授して頂ければ、幸いです。

以下のようなマクロを現在作成中です。

・指定したExcelのsheet一括して加工する。
ただし、Excelのsheet数はExcelによって異なる。Excelによっては、2~9sheetある。

・なにを加工したか、分かりやすくするため、加工前のsheetは残す。

☆困っていること。
それぞれのsheetで置換・非表示等の処理を行っているのですが、F8ではちゃんと動くものの、
実行を押すと正常に動かなくなってしまう。


Sub Macro1()
    Dim NameFileOpen As String
    Dim NameFileOpenOnlyFilename As String
    Dim ws As Worksheet
   

'指定したExcelファイルを開く
    MsgBox "加工するExcelファイルを指定して下さい。"
    

    NameFileOpen = Application.GetOpenFilename(FileFilter:="Microsoft EXCELブック,*.xlsx")
    If NameFileOpen <> "False" Then
        Workbooks.Open FileName:=NameFileOpen
    End If
    
    NameFileOpenOnlyFilename = Dir(NameFileOpen)

    
          
'開いたブックでの処理
        
'Excelのsheetを選択してコピー
    Workbooks(NameFileOpenOnlyFilename).Activate
    Workbooks(NameFileOpenOnlyFilename).Sheets().Copy Before:=Sheets(1)

'コピーしたsheetの判定
    For i = 1 To Sheets.Count
    
    'シート名に、「(2)」を含む場合
    If InStr(Sheets(i).Name, "(2)") > 0 Then
    
       'ここの処理で毎回正常に動かなくなってしまいます。F8では動くのに……
        For s = 1 To 100
            If Sheets(i).Cells(s, 2) = "青森" Then '青森があったら
                Sheets(i).Cells(s, 2) = Replace(Cells(s, 2), "青森", "青森県")'青森県に置換
                Sheets(i).Cells(s, 2).Offset(0, 2).ClearContents'青森の隣の隣のセルをクリア
            End If

            If Sheets(i).Cells(s, 2) = "埼玉" Then
                Sheets(i).Cells(s, 2) = Replace(Cells(s, 2), "埼玉", "埼玉県")
                Sheets(i).Cells(s, 2).Offset(0, 2).ClearContents
            End If

            If Sheets(i).Cells(s, 1) = "北海道" Then
                Cells(s, 1).EntireRow.Hidden = True
            End If
        Next s
  End If
  Next i
End Sub


どなたか助けて頂けると幸いです。

スポンサーリンク
[返信 1] Re : Excelの複数sheetの一括加工
投稿者 : さんこう     投稿日時 : 2024/11/28(Thu) 14:23:25
>実行を押すと正常に動かなくなってしまう。

「正常に動かなく」のような、雑な表現では問題点を把握できません。

具体的に、「○○となるはずなのに、△△となってしまう」のように、現象を把握しましょう。


※シート指定が中途半端なことが影響しているようにも思いますが、
「F8ではちゃんと動く」ことにはならないですね。

[返信 2] Re : Excelの複数sheetの一括加工
投稿者 : 焼きそば     投稿日時 : 2024/11/28(Thu) 15:12:34
さんこう様


具体的な不具合は以下の通りです。

・本当はsheet2の列で非表示されるべきなのに、sheet1の列で非表示になってしまう。

If Sheets(i).Cells(s, 1) = "北海道" Then
Cells(s, 1).EntireRow.Hidden = True
End If
→sheet1では北海道の列は非表示になりますが、sheet2では非表示にならず、
sheet1の30列が非表示になる。(sheet2の30列に北海道がある)


・本当は隣の隣のセルをクリアしたのだが、一緒に青森県もクリアになってしまう。

      If Sheets(i).Cells(s, 2) = "青森" Then '青森があったら
Sheets(i).Cells(s, 2) = Replace(Cells(s, 2), "青森", "青森県")'青森県に置換
Sheets(i).Cells(s, 2).Offset(0, 2).ClearContents'青森の隣の隣のセルをクリア
End If
→sheet2以降に現れる現象です。sheet1には隣の隣のセルだけクリアされます。


こういった現象が起きてしまっています……

[返信 3] Re : Excelの複数sheetの一括加工
投稿者 : さんこう     投稿日時 : 2024/11/28(Thu) 15:44:47
説明ありがとうございます。

やはり、シート指定が中途半端なことが原因と思われます。

>・本当はsheet2の列で非表示されるべきなのに、sheet1の列で非表示になってしまう。
>Cells(s, 1).EntireRow.Hidden = True

非表示にしたい行の指定に、シート指定がないので、アクティブシートが非表示になってしまっているのでしょう。


>・本当は隣の隣のセルをクリアしたのだが、一緒に青森県もクリアになってしまう。
>Sheets(i).Cells(s, 2) = Replace(Cells(s, 2), "青森", "青森県")'青森県に置換

「青森県もクリアになってしまう」のではなく、別のシート(アクティブシート)のデータが書き込まれているのでしょう。

[返信 4] Re : Excelの複数sheetの一括加工
投稿者 : 焼きそば     投稿日時 : 2024/11/28(Thu) 17:20:26
さんこう様

助言ありがとうございました。

アクティブシートを指定したところ、無事に動作が確認できました。

当掲示板について
  • Excel VBA に関する掲示板です。Excel VBA に関する質問や疑問、それに対する解決方法など気軽に投稿してください。
  • 記事内ではHTMLのタグは使用できません。
  • 記事は一度投稿すると修正できません。内容を訂正したい場合は返信で対応してください。
  • Sub〜End Sub、Function〜End Function は自動的にプログラムコードとみなし、枠で囲って見やすくします。
  • Excel VBA とは関係ないことや、他人が不快に思うようなことなど、管理人が適当でないと判断した記事は削除する場合があります。
スポンサーリンク
返信入力フォーム
お 名 前  :
内  容   :

ステータス  :

認証コード  : キャプチャ画像 




( 処理日時 : 2024-12-07 22:53:51 )
タイトルとURLをコピーしました