エクセル2013、フォルダ内にある各ファイル、

Writer: admin Type: regalmach Date: 2019-01-05 00:00
エクセル2013、フォルダ内にある各ファイル、決まったシート名の列幅及び行高を全て同じにするマクロ、もしくはVBScriptを教えて下さい。どうか、よろしくお願いいたします。【条件】1)OSは、Windows7(32bit)、エクセルは、エクセル2013です。2)シート内のセル値は、現状値のままとして、変更はしないこと。3)各ファイルは開かない状態で、一度の実行で設定するものとします。4)フォルダ、D:\エクセルデータ\にある複数のエクセルファイル、シート名「A」の列幅及び行高を下記の値に設定する。 フォルダ内のファイル名はバラバラで、ファイルには複数のシートがあり、必ずシート名「A」はあります。 ファイル数は、300ファイル程度、各ファイル内のシート数は3~6シートです。 全てのエクセルファイルあるシート名「A」に処理をお願いします。5)列幅(ピクセル値)→A列からZ列まで設定、それ以降は初期値でOKです。 A:39 B:141 C:61 D:155 E:49 F:373 G:84 H:69 I:61 J:69 K:61 L:93 M:68 N:96 O:46 P:46 Q:263 R:141 S:263 T:118 U:241 V:250 W:73 X:73 Y:73 Z:73 それ以降は初期値6)行高(ピクセル値)→1行から300列まで設定、それ以降は初期値でOKです。 1:18 2:18 3:18 4:29 5:29 6:29 7:29 8:29 9:23 10:23~300:23 それ以降は初期値7)各コード、簡単な動作説明も教えてください。以上共感した0###「VBScript」による回答です。ブックは開いていますが(そうでないと処理できません)、表示はしていません。プログラムファイル(「~.vbs」ファイル)が存在するフォルダ内の、すべての拡張子が「xlsx」を処理します。処理するすべてのブックには、「A」という名前のシートが存在していなければなりません。★★★列幅は、どうも「255」以上の値を設定することができないみたいですので、今は、最大値を「255」にしています★★★Option ExplicitDim bk, c, ex, f, gf, h, i, r, so, wSet so = CreateObject("Scripting.FileSystemObject")Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))Set ex = CreateObject("Excel.Application")ex.Application.DisplayAlerts = Falseex.Visible = Falsew = Array(39, 141, 61, 155, 49, 255, 84, 69, 61, 69, 61, 93, 68, 96, 46, 46, 255, 141, 255, 118, 241, 250, 73, 73, 73, 73)h = Array(18, 18, 18, 29, 29, 29, 29, 29, 23, 23)For Each f In gf.FilesIf LCase(so.GetExtensionName(f.Name)) = "xlsx" ThenSet bk = ex.Workbooks.Open(gf & "\" & f.Name)With bk.Worksheets("A")For i = 0 to UBound(w).Columns(i + 1).ColumnWidth = w(i)NextFor i = 0 to UBound(h) - 1.Rows(i + 1).RowHeight = h(i)Next.Range("10:300").RowHeight = h(UBound(h))End Withbk.Savebk.CloseSet bk = NothingEnd IfNextex.QuitSet ex = NothingSet gf = NothingSet so = NothingMsgBox("Finished!")簡単な説明です。Option Explicit「厳密に」とか、「明確に」というような意味で、このオプションを設定すると、変数は、その使用の前に、必ず、「Dim」等によって宣言しておかなければなりません。Set so = CreateObject("Scripting.FileSystemObject")ファイルやフォルダを扱えるようにしています。Set gf = so.GetFolder(so.GetParentFolderName(WScript.ScriptFullName))プログラムファイル(「~.vbs」ファイル)自身が存在するフォルダ、すなわち、これから処理する「xlsx」ファイル群が存在するフォルダを取得しています。Set ex = CreateObject("Excel.Application")エクセルを扱えるようにしています。ex.Application.DisplayAlerts = False「上書きしますか?」などと聞いてこないようにしています。ex.Visible = Falseエクセルを表示しません。w = Array(39, 141, 61, 155, 49, 255, 84, 69, 61, 69, 61, 93, 68, 96, 46, 46, 255, 141, 255, 118, 241, 250, 73, 73, 73, 73)各列幅の設定値。h = Array(18, 18, 18, 29, 29, 29, 29, 29, 23, 23)各行高の設定値。For Each f In gf.Filesプログラムファイルの存在するフォルダ内のすべてのファイルを1つずつ処理。If LCase(so.GetExtensionName(f.Name)) = "xlsx" Thenもし、拡張子が「xlsx」なら(「LCase()」は、英字を小文字にする関数、「GetExtensionName()」は、拡張子をしらべます)。Set bk = ex.Workbooks.Open(gf & "\" & f.Name)そのブックを開いています。With bk.Worksheets("A")ワークシート「A」を処理対象にしています。For i = 0 to UBound(w).Columns(i + 1).ColumnWidth = w(i)Next列幅を設定しています。「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。For i = 0 to UBound(h) - 1.Rows(i + 1).RowHeight = h(i)Next1~9行目までの行高を設定しています。.Range("10:300").RowHeight = h(UBound(h))10~300行までの行高を設定しています。End Withワークシート「A」を対象にするのはここまでです。bk.Save上書き保存しています。bk.CloseSet bk = Nothing閉じています。End IfNextを、すべてのフォルダ内のファイルで繰り返しています。ex.Quitエクセルそのものを終了しています。Set ex = NothingSet gf = NothingSet so = Nothing「Set ~」で使った変数は、その使用後、「Nothing」で解放しておきます。MsgBox("Finished!")いつ終わったか分からないので、最後に「Finished!」と表示しています。ナイス0
###lin_nyan36様、回答有難う御座います。教えて頂いたVBScript、30ファイルに実行しましたが、1つのファイルのみ変更で、残り29ファイルは変化なしでした。各ファイルとも更新日時が変わっていますのでブック自体は開いて閉じているようです。「Finished!」と表示して、エラー表示もなしです。見直しをお願いします。なお、列幅、行高の値ですが、ピクセルではなく、数値の通りでOKでした。以上
###lin_nyan36様、回答有難う御座います。希望通りの動作でOKでした。助かりました。以上###3)各ファイルは開かない状態で、一度の実行で設定するものとします。↑コレがネックです結論から言うと”可能”ですが、それなりの知識と情報が必要圧縮された2007形式のExcelファイルのXMLを解析して書き換えることで恐らくは可能ただそれを可能に出来る人はそんな面倒な事はしませんファイルを開いて設定を変更して上書き保存するほうが簡単だからですナイス0

 

TAG