[[20150404000731]] 『複数エクセルファイルの自動置換マクロ』(まこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数エクセルファイルの自動置換マクロ』(まこ)

ヘッダにある 、 だけを取り除きたいです。
ひとつのエクセルファイルごとに行選択して置換でできますが、無数のファイルがあるとき困ってしまいます。

例えばエクセルファイルをドラッグしてあるソフトに入れれば、自動で上記のことができて吐きだされるというものはマクロでできるのでしょうか。

もしくはエクセルファイルを複数選択してあるソフトへドラッグしたら自動置換されてはきだれるというようなものです。よろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 エクセルファイルにあるヘッダーとは、そのブックのどのシートのどこにあるのでしょうか?

 ドラッグして、ほうり込むというイメージは、たとえばエクスプローラ上で複数のブックを選択してOKボタンを押すといったことでもよろしいですか?

 吐き出されるというのは、自動置き換え後、保存されるということでいいですか?

(β) 2015/04/04(土) 08:27


もし、各エクセルファイルの一行目だけ削除したいというのなら次のマクロはどうでしょう?

Sub aaa()
Dim a As Long
Dim Path As String
Dim u As String
Dim b As Long
a = 1
Path = "エクセルファイルが入っているフォルダのパス名+\"
'記入例 C:\Users\ユーザー名\Documents\aba\
u = Dir(Path & "*.xlsx")
Do Until u = ""
Cells(a, 1).Value = u
u = Dir()
a = a + 1
Loop
b = a
a = 1
Do Until a = b
Workbooks.Open Path & Cells(a, 1).Value
Workbooks(Cells(a, 1).Value).Sheets(1).Rows("1:1").Delete Shift:=xlUp
Workbooks(Cells(a, 1).Value).Save
Workbooks(Cells(a, 1).Value).Close
a = a + 1
Loop
End Sub
(スズメ) 2015/04/04(土) 10:21


 To スズメさん

 おそらく、どこかのセルにある先頭の 、 だけを消去したいんだと思います。
 現在手作業で【置換】で処理しておられるのですから。
 それはともあれ。

 '記入例 C:\Users\ユーザー名\Documents\aba\ 

 ユーザー名をハードコーディングすると、他のPCで実行した時に動かなくなります。
 これらパスは、動的に取得することが必要です。以下、参考コードです。

  Sub Sample1()
    Dim path As String

    path = CreateObject("WScript.Shell").Specialfolders("DeskTop")
    MsgBox path

    path = CreateObject("WScript.Shell").Specialfolders("myDocuments")
    MsgBox path

    path = Environ("USERPROFILE")
    MsgBox path

  End Sub

 また、後半のループ、これは For/Next で書くべきところですね。
 というか、前半で処理してしまえば、後半は不要ですけどね。

(β) 2015/04/04(土) 10:36


 マクロ内で表示されるファイル選択ダイアログ上で、処理したいブックを複数選択し、OKを押せば実行します。
 とりあえず、選択されたブックの最初のシートの1行目にある "、" を消去しています。
 場所は、そこではなく、ここ とか、たとえば、各セルの先頭にあるものだけ 等々 要件については
 言ってもらえれば対応します。

 Sub Test()
    Dim fList As Variant
    Dim fName As Variant
    Dim bk As Workbook

    '処理したいブックの選択。複数選択可能。
    fList = Application.GetOpenFilename(FileFilter:="対象ブック,*.xls*", MultiSelect:=True)
    If Not IsArray(fList) Then Exit Sub 'キャンセルボタン

    Application.ScreenUpdating = False

    For Each fName In fList
        Set bk = Workbooks.Open(fName)
        bk.Sheets(1).UsedRange.Rows(1).Replace What:="、", Replacement:="", LookAt:=xlPart
        bk.Close True
    Next

    MsgBox "クリーニング、完了です"

 End Sub

(β) 2015/04/04(土) 11:13


 ドロップしたいというところに反応して、お遊びのコードです。

 新規ファイルに下記のマクロを置き、適当な名前を付けてマクロブックとして保存して
 閉じます。

 もう一度このファイルを開くと、ファイルと同じフォルダに、
 「ここにファイルをドロップしてください.vbs」
 というファイルができるので、ここに処理をしたい EXCEL ファイルをドロップします。

 ヘッダ内(各シートの1行目)の「、」が削除されます。
 このマクロファイルを閉じると「ここにファイルをドロップしてください.vbs」も消えます。

 マクロの設定
  EXCEL から Alt+F11 で開いたウィンドウで、
    ツール ⇒ 参照設定 Microsoft Scripting Runtime にチェックします。

  ThisWorkbook の下に
 「(1)ThisWorkbook モジュール」のコードを

 挿入⇒標準モジュール  で開いたウィンドウに
 「(2)標準モジュール」のコードを置きます。

  (1)ThisWorkbook モジュール
 −−−−−−−−−−−−−−−−−−−−−−
 Private Sub Workbook_Open()
    CleanupHeaderConstructor
 End Sub

 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    CleanupHeaderDestructor
 End Sub
 −−−−−−−−−−−−−−−−−−−−−−

 (2)標準モジュール
 −−−−−−−−−−−−−−−−−−−−−−
 Option Explicit

 Const ScriptName = "ここにファイルをドロップしてください.vbs"
 Const ListName = "CleanupHeaderList.txt"

 Public NextScheduleTime

 '//-----------------------------
 Sub CleanupHeaderConstructor()
 '//-----------------------------
    Dim fso As New Scripting.FileSystemObject

    Dim dropScriptPath
    dropScriptPath = ThisWorkbook.Path & "\" & ScriptName

    '// スクリプトの作成
    Dim ListFilePath
    ListFilePath = ThisWorkbook.Path & "\" & ListName

    With fso.CreateTextFile(dropScriptPath, True)
        .WriteLine "Dim fso"
        .WriteLine "Set fso = CreateObject(""Scripting.FileSystemObject"")"
        .WriteLine "If WScript.Arguments.Count = 0 Then WScript.Quit"
        .WriteLine "With fso.OpenTextFile(""" & ListFilePath & """, 8, True )"
        .WriteLine "    For i=0 To WScript.Arguments.Count - 1"
        .WriteLine "        .WriteLine WScript.Arguments(i)"
        .WriteLine "    Next"
        .WriteLine "    .Close"
        .WriteLine "End With"
        .Close
    End With

    Dim wsh
    Set wsh = CreateObject("WScript.Shell")

    '// デスクトップショートカットの作成
    Dim ShortCutPath
    ShortCutPath = wsh.SpecialFolders("Desktop") & "\" & Replace(ScriptName, ".vbs", ".lnk")

    With wsh.CreateShortcut(ShortCutPath)
        .TargetPath = dropScriptPath
        .IconLocation = "shell32.dll,43"
        .Save
    End With

    '// スケジュールの設定
    With ThisWorkbook.Worksheets(1)
        .Range("A1:B1") = Array("実行時間", "処理ファイル")
        .Columns("A").NumberFormatLocal = "YYYY/MM/DD hh:mm:ss"
        .Columns("A").ColumnWidth = 20
    End With
    CleanupHeader
 End Sub

 '//-----------------------------
 Sub CleanupHeaderDestructor()
 '//-----------------------------
    Dim fso As New Scripting.FileSystemObject

    '// スクリプトの削除
    Dim dropScriptPath
    dropScriptPath = ThisWorkbook.Path & "\" & ScriptName

    If fso.FileExists(dropScriptPath) Then fso.DeleteFile dropScriptPath

    Dim wsh
    Set wsh = CreateObject("WScript.Shell")

    '// デスクトップショートカットの削除
    Dim ShortCutPath
    ShortCutPath = wsh.SpecialFolders("Desktop") & "\" & Replace(ScriptName, ".vbs", ".lnk")

    If fso.FileExists(ShortCutPath) Then fso.DeleteFile ShortCutPath

    '// スケジュールの解除
    On Error Resume Next
    Application.OnTime NextScheduleTime, "CleanupHeader", , False
 End Sub

 '//-----------------------------
 Sub CleanupHeader()
 '//-----------------------------
    Dim fso As New Scripting.FileSystemObject

    Dim ListFilePath
    ListFilePath = ThisWorkbook.Path & "\" & ListName

    Dim fl
    Dim f
    Dim ff
    Dim ws As Worksheet
    If fso.FileExists(ListFilePath) = True Then
        fl = Split(fso.OpenTextFile(ListFilePath).ReadAll(), vbNewLine)
        fso.DeleteFile ListFilePath
        For Each f In fl
            '// ドロップされたのがフォルダだったら、中のフォルダとファイルをリストに追記
            If fso.FolderExists(f) Then
                With fso.OpenTextFile(ListFilePath, 8, True)
                    For Each ff In fso.GetFolder(f).SubFolders
                        .WriteLine ff.Path
                    Next
                    For Each ff In fso.GetFolder(f).Files
                        .WriteLine ff.Path
                    Next
                    .Close
                End With
            End If

            '// ドロップされたのが EXCEL ファイルだったら全シートを処理
            If InStr(LCase(fso.GetExtensionName(f)), "xls") > 0 Then
                Application.ScreenUpdating = False
                Application.Calculation = xlCalculationManual
                Application.EnableEvents = False

                With Workbooks.Open(f)
                    For Each ws In .Worksheets
                        ws.Rows(1).Replace What:="、", Replacement:="", LookAt:=xlPart  '// 置換処理
                    Next
                    .Save
                    .Close
                End With

            '// 先頭シートに実行履歴を記録
                With ThisWorkbook.Worksheets(1)
                    Cells(Rows.Count, "A").End(xlUp).Offset(1, 0).Resize(1, 2) = Array(Now(), f)
                End With

                Application.EnableEvents = True
                Application.Calculation = xlCalculationAutomatic
                Application.ScreenUpdating = True
            End If
        Next
    End If
    NextScheduleTime = Now + TimeValue("00:00:05")
    Application.OnTime NextScheduleTime, "CleanupHeader"
 End Sub
 −−−−−−−−−−−−−−−−−−−−−−

(Mook) 2015/04/04(土) 11:30


 To Mookさん

 わぁ、おもしろいですね!
 勉強になりますし、今後、この手法、パクらせてもらうかもです。

 同時にデスクトップにショートカットを作り出して、そこにドロップしてもらうのもいいかもしれませんね。

 ところで、Sub CleanupHeaderConstructor() の  With fso.CreateTextFile(dropScriptPath)
 この End With の前に .Close が抜けてませんか?

(β) 2015/04/05(日) 07:05


 確かにお行儀悪いかもしれませんが、プロシージャやスクリプト終了時にフラッシュ
 されると(勝手に)信じているので、単一ファイルの処理では省略して使ってますが、
 ここはお行儀よく .Close しておいた方が良いですね。

 修正しました。
 (ダブルで抜けていました。)

 ファイルはデスクトップに出す方がアイデアとしては面白いですね。
 アイコンを変えたり、フォルダをドロップしたら下を検索したりと、
 改善の余地は多々あると思います。

(Mook) 2015/04/05(日) 10:10


 自分のコメントに、自分で対応w。

 以下、変更点です。
 ・デスクトップにアイコンを表示(★アイコン)
 ・フォルダをドロップすると、フォルダ以下のファイルを処理
 ・処理した時間とファイルの履歴を先頭シートに表示

 に対応したコードに差し替えました。

(Mook) 2015/04/05(日) 20:58
(Mook) 2015/04/05(日) 21:38 追加修正


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.