<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DOSコマンドの実行 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<atom:link href="https://officevba.info/category/vba%E5%85%B1%E9%80%9A/other-application-operation/dos%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%AE%9F%E8%A1%8C/feed/" rel="self" type="application/rss+xml" />
	<link>https://officevba.info</link>
	<description>仕事の役に立つVBA・GAS・Pythonのコードを紹介していきます。</description>
	<lastBuildDate>Sat, 31 Jan 2026 12:17:12 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>

<image>
	<url>https://officevba.info/wp-content/uploads/2017/04/cropped-Excel_1-32x32.jpg</url>
	<title>DOSコマンドの実行 | VBA・GAS・Pythonで仕事を楽しく効率化</title>
	<link>https://officevba.info</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>複数のパスワード付きzipに一括で色々なファイルを格納するVBAコード</title>
		<link>https://officevba.info/vbazipfilewithpassword/</link>
					<comments>https://officevba.info/vbazipfilewithpassword/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 19 Dec 2021 13:54:46 +0000</pubDate>
				<category><![CDATA[DOSコマンドの実行]]></category>
		<category><![CDATA[LhaPlus]]></category>
		<category><![CDATA[VBA]]></category>
		<category><![CDATA[zip]]></category>
		<category><![CDATA[コマンドプロンプト]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://officevba.info/?p=2353</guid>

					<description><![CDATA[目次 同僚からの依頼でzipファイル格納のVBA検討zip格納に「LhaPlus」を使用する今回考えた自動zip格納VBAツールの仕組み事前準備ツールファイルの画面ツール操作実行手順今回作成したVBAコード①フォルダ取得 [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-2" checked><label class="toc-title" for="toc-checkbox-2">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">同僚からの依頼でzipファイル格納のVBA検討</a></li><li><a href="#toc2" tabindex="0">zip格納に「LhaPlus」を使用する</a></li><li><a href="#toc3" tabindex="0">今回考えた自動zip格納VBAツールの仕組み</a><ol><li><a href="#toc4" tabindex="0">事前準備</a></li><li><a href="#toc5" tabindex="0">ツールファイルの画面</a></li><li><a href="#toc6" tabindex="0">ツール操作実行手順</a></li></ol></li><li><a href="#toc7" tabindex="0">今回作成したVBAコード</a><ol><li><a href="#toc8" tabindex="0">①フォルダ取得</a></li><li><a href="#toc9" tabindex="0">②zip格納</a></li></ol></li><li><a href="#toc10" tabindex="0">動作確認の動画とあとがき</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">同僚からの依頼でzipファイル格納のVBA検討</span></h2>
<p>最近社内でメールのシステムが変更になり、これまで外部への添付ファイルは自動で「①zipに格納→②パスワード生成→③別メールでパスワードを送付」ができていたのですが、手作業でzipを作成することになりました。</p>
<p>元々パスワード付きzipファイルをメールで送るフロー自体が色々と問題を引き起こす可能性も指摘されているので、その運用自体止めてしまえばよい気もするのですが、セキュリティ対策の主観部署がこれまで行っていたzip格納を止める判断をしなかったらしく上記のように手作業の負担が増えていました。</p>
<p>今回はパスワード付きzipファイルに必要なファイルを連続で圧縮するExcelVBAコードを考えてみました。</p>
<h2><span id="toc2">zip格納に「LhaPlus」を使用する</span></h2>
<p>以前<a href="https://officevba.info/vbazipfile/" target="_blank">こちらの記事</a>で紹介していますが、zip格納を安定して実行するためにLhaPlusというフリーソフトを使用します。</p>
<p>Windows標準の機能を呼び出してzip格納をする方法もあるのですが、公式なサポート外らしくエラーが起こるし動作が不安定でした。<br />
LhaPlusはコマンドプロンプトから操作ができるようになっていて、それを利用することでVBAからも自動操作が可能になります。</p>
<h2><span id="toc3">今回考えた自動zip格納VBAツールの仕組み</span></h2>
<p>今回私が考えたツールの動作と業務のフローは以下の通りです。</p>
<h3><span id="toc4">事前準備</span></h3>
<p>①zipファイルに格納したいファイルをフォルダごとにまとめてあるフォルダに格納</p>
<p>②zip変換用フォルダをまとめて格納しているフォルダにツールファイルも一緒に格納（vba162_zip一括返還211219.xlsm）</p>
<p>詳細は以下の画像のような状態です。</p>
<p><a href="https://officevba.info/wp-content/uploads/2021/12/vba162-1.jpg"><img fetchpriority="high" decoding="async" src="https://officevba.info/wp-content/uploads/2021/12/vba162-1-700x248.jpg" alt="" width="700" height="248" class="alignnone size-large wp-image-2349" srcset="https://officevba.info/wp-content/uploads/2021/12/vba162-1-700x248.jpg 700w, https://officevba.info/wp-content/uploads/2021/12/vba162-1-300x106.jpg 300w, https://officevba.info/wp-content/uploads/2021/12/vba162-1-768x272.jpg 768w, https://officevba.info/wp-content/uploads/2021/12/vba162-1-1536x545.jpg 1536w, https://officevba.info/wp-content/uploads/2021/12/vba162-1.jpg 2019w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<h3><span id="toc5">ツールファイルの画面</span></h3>
<p>ツールファイルは以下のような画面で作成しています。<br />
まずzipを作成するためのフォルダ一覧を取得して、パスワードを手入力したあと、zipを作成するフローを想定しています。</p>
<p><a href="https://officevba.info/wp-content/uploads/2021/12/vba162-2.jpg"><img decoding="async" src="https://officevba.info/wp-content/uploads/2021/12/vba162-2-700x314.jpg" alt="" width="700" height="314" class="alignnone size-large wp-image-2350" srcset="https://officevba.info/wp-content/uploads/2021/12/vba162-2-700x314.jpg 700w, https://officevba.info/wp-content/uploads/2021/12/vba162-2-300x135.jpg 300w, https://officevba.info/wp-content/uploads/2021/12/vba162-2-768x345.jpg 768w, https://officevba.info/wp-content/uploads/2021/12/vba162-2.jpg 1226w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<h3><span id="toc6">ツール操作実行手順</span></h3>
<p>①フォルダ取得ツールでzipに格納したいフォルダ一覧を取得<br />
「フォルダ取得」ボタンをクリックするとツールフォルダが格納されているフォルダをB1セルに表示し、その中のサブフォルダを一覧にしてA列に取得して入力</p>
<p>②作成するzipファイルのパスワードを入力（B列）<br />
パスワードが規則性のあるものにするならVBAで自動化することもできますが、今回は手入力するフローにしています。</p>
<p>③zip格納ボタンをクリック<br />
サブフォルダの中のファイルが同じ名前のzipに格納され、作成されたサブフォルダ「zip格納」の中にzipファイルが作成される</p>
<h2><span id="toc7">今回作成したVBAコード</span></h2>
<h3><span id="toc8">①フォルダ取得</span></h3>
<div class="GASCode">
<pre>Sub フォルダ取得()
    
    Dim FSO As Object, WSH As Object
    
    Dim FoldPath As String
    Dim FolderName As String
    Dim ArrFolderName() As String
    
    Dim i As Long, k As Long
    
    Set FSO = CreateObject("Scripting.FileSystemObject")
    FoldPath = ThisWorkbook.Path

    Cells(1, 2) = FoldPath
    i = 0
    FolderName = Dir(FoldPath &#038; "\*", vbDirectory)
    Do While FolderName <> ""
        If InStr(FolderName, ".") = 0 And FolderName <> "zip格納" Then
            ReDim Preserve ArrFolderName(i)
            ArrFolderName(i) = FolderName
            Cells(i + 4, 1) = FolderName
            'Cells(i + 4, 2) = Left(Cells(i + 4, 1), 4)
            i = i + 1
        End If
    FolderName = Dir()
    Loop
    
End Sub</pre>
</div>
<h3><span id="toc9">②zip格納</span></h3>
<div class="GASCode">
<pre>Sub サブフォルダzip格納()

    Dim Cmd As String
    Dim ArrFileName, FileName
    Dim FSO, WSH
    Dim 前FoldPath, 後FoldPath

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set WSH = CreateObject("Wscript.Shell")

    WSH.CurrentDirectory = "C:\Program Files (x86)\Lhaplus"

    '前FoldPathに格納されているサブフォルダをzip格納して後FoldPathに格納
    前FoldPath = Cells(1, 2)
    後FoldPath = Cells(1, 2) &#038; "\zip格納"

    'zip格納用のフォルダ作成
    If FSO.FolderExists(後FoldPath) = False Then
        FSO.CreateFolder 後FoldPath 'フォルダ作成
    End If

    '後で使用する対象ファイル一覧表が残っていたら削除
    If FSO.FileExists(前FoldPath &#038; "\圧縮リスト.txt") = True Then
        FSO.DeleteFile 前FoldPath &#038; "\圧縮リスト.txt"
    End If

    Dim i
    i = 4
    Do Until Cells(i, 1) = ""
        ArrFileName = ""
        FileName = Dir(前FoldPath &#038; "\" &#038; Cells(i, 1) &#038; "\*.*", vbNormal)
        Do While FileName <> ""
            If ArrFileName <> "" Then
                ArrFileName = ArrFileName &#038; vbCrLf &#038; 前FoldPath &#038; "\" &#038; Cells(i, 1) &#038; "\" &#038; FileName
            Else
                ArrFileName = 前FoldPath &#038; "\" &#038; Cells(i, 1) &#038; "\" &#038; FileName
            End If
        FileName = Dir()
        Loop

        'コマンドプロンプトは文字数の上限があるので、対象ファイル一覧を「圧縮リスト.txt」に入力
        With FSO.CreateTextFile(Cells(1, 2) &#038; "\圧縮リスト.txt")
            .WriteLine ArrFileName
            .Close
        End With

        'cells(i,2)がPassword 空欄ならパスワード設定なしでzip格納
        Cmd = "Lhaplus.exe /c:zip /n:" &#038; 後FoldPath &#038; "\" &#038; Cells(i, 1) &#038; ".zip" &#038; " /p:" &#038; Cells(i, 2).Text &#038; " /l:" &#038; Cells(1, 2) &#038; "\圧縮リスト.txt"

        WSH.Run "%ComSpec% /c " &#038; Cmd, 7, True

        FSO.DeleteFile Cells(1, 2) &#038; "\圧縮リスト.txt"

    i = i + 1
    Loop

    Set FSO = Nothing
    Set WSH = Nothing

End Sub</pre>
</div>
<h2><span id="toc10">動作確認の動画とあとがき</span></h2>
<p>今回作成したコードを実行した動画は以下の通りです。</p>
<div style="width: 1280px;" class="wp-video"><video class="wp-video-shortcode" id="video-2353-1" width="1280" height="720" preload="metadata" controls="controls"><source type="video/mp4" src="https://officevba.info/wp-content/uploads/2021/12/vba162-3.mp4?_=1" /><a href="https://officevba.info/wp-content/uploads/2021/12/vba162-3.mp4">https://officevba.info/wp-content/uploads/2021/12/vba162-3.mp4</a></video></div>
<p>パスワード付きzipファイルをメールで送る文化には賛否両論ありますが、私の会社含めまだまだ根強く残ると思います。<br />
自動サービスがなくなっていってしまう中手作業でこの処理を続けるのは結構つらいと思うので自動処理を考えてみました。</p>
<p>今回ご紹介したコードはコマンドプロンプトを起動している時間PCを使えない（キャンセルしてしまう可能性がある）ので、大量のファイルをzipに格納する場合、別のPCを使うか休憩時間前などに実行だけして休憩時間中に作成することをおすすめします。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/vbazipfilewithpassword/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://officevba.info/wp-content/uploads/2021/12/vba162-3.mp4" length="0" type="video/mp4" />

			</item>
		<item>
		<title>VBAでファイルを一括でzipフォルダに圧縮</title>
		<link>https://officevba.info/vbazipfile/</link>
					<comments>https://officevba.info/vbazipfile/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Sun, 03 Sep 2017 10:35:17 +0000</pubDate>
				<category><![CDATA[DOSコマンドの実行]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=1130</guid>

					<description><![CDATA[目次 電子書籍をタブレット・スマホで読むにはZipが便利LhaPlusという圧縮ソフトを使用するLhaPlusのコマンドラインLhaPlusのコマンドの種類よくあるネットで紹介されているLhaPlusの使用方法私がLha [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-4" checked><label class="toc-title" for="toc-checkbox-4">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">電子書籍をタブレット・スマホで読むにはZipが便利</a></li><li><a href="#toc2" tabindex="0">LhaPlusという圧縮ソフトを使用する</a></li><li><a href="#toc3" tabindex="0">LhaPlusのコマンドライン</a><ol><li><a href="#toc4" tabindex="0">LhaPlusのコマンドの種類</a></li><li><a href="#toc5" tabindex="0">よくあるネットで紹介されているLhaPlusの使用方法</a></li><li><a href="#toc6" tabindex="0">私がLhaPlusを操作するのに使用したコード</a></li></ol></li><li><a href="#toc7" tabindex="0">VBAコード紹介</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">電子書籍をタブレット・スマホで読むにはZipが便利</span></h2>
<p>私はよく電子書籍をjpg形式で保管しているのですが、通常のフォルダで管理しているとスマホ、タブレットに入れるとギャラリーの中に電子書籍のデータが入ったり、また開くアプリによってページ順がばらばらになったりしていました。</p>
<p>「.」から始まるフォルダを作成しておけばギャラリーの中に画像が入り込むことはなくなりますが、管理が面倒になります。<br />
（私が使っているスマホはパソコンと接続しても「.」から始まるフォルダが表示されません。）</p>
<p>今回は私が持っている電子書籍のデータを一括でZipフォルダに変更するために作成したVBAコードを紹介します。</p>
<h2><span id="toc2">LhaPlusという圧縮ソフトを使用する</span></h2>
<p>「.CopyHere」というメソッドを用いたWindows標準の機能でもZipファイルは作成できますが、たくさんのファイルをZipフォルダの中に入れようとするとエラーが起こり途中で止まってしまいました。</p>
<p>この作成方法はWindowsのサポート対象外の機能のようでうまく動作しない場合があると<a rel="noopener" href="https://support.microsoft.com/ja-jp/help/2679832" target="_blank">Microsoftのページ</a>でも記載されています。</p>
<p>そこで圧縮のフリーソフトで有名なLhaPlusというものを使用することにしました。LhaPlusは色々なところでダウンロードできますが、私は<a rel="noopener" href="http://forest.watch.impress.co.jp/library/software/lhaplus/" target="_blank">窓の杜のページ</a>からダウンロードしました。</p>
<p>このLhaPlusはコマンドラインで操作できるのが特徴で、VBAと組み合わせるとかなり自由な操作が可能になります。</p>
<h2><span id="toc3">LhaPlusのコマンドライン</span></h2>
<p>私が把握しているコマンドラインでのLhaPlusを操作するコードは以下のものです。</p>
<h3><span id="toc4">LhaPlusのコマンドの種類</span></h3>
<li>/p:xxx パスワード付きzip圧縮でパスワードを指定する</li>
<li>/o:xxx 出力先フォルダ(圧縮フォルダを作成するフォルダ)を指定</li>
<li>/n:xxx 出力するファイル名(圧縮フォルダの名前)を指定する</li>
<li>/l:xxx 指定のファイルで記述されたファイル一覧を操作対象にする</li>
<h3><span id="toc5">よくあるネットで紹介されているLhaPlusの使用方法</span></h3>
<div class="VBACode">Lhaplus.exe /o:圧縮ファイルを作成するフォルダ名（フルパス） /c:zip 圧縮したいファイル（フルパス）</div>
<p>圧縮したいファイルが複数ある場合は半角スペースを空けて記入することで一つの圧縮フォルダに複数のファイルを格納することができるようです。</p>
<div class="VBACode">Lhaplus.exe /o:圧縮ファイルを作成するフォルダ名（フルパス） /c:zip 圧縮したいファイル①（フルパス） 圧縮したいファイル②（フルパス）…</div>
<p>このコードをそのまま使用した場合、今回の目的に対して2点問題が生じました。</p>
<p>1つ目は圧縮フォルダの名前が先頭のファイル名になってしまうことです。これはあとで変更しても良いので大した問題ではないですが、できれば解決しておきたい部分です。</p>
<p>そして2つ目が命取りの問題で、コマンドラインに出力する文字数の制限を超えることです。<br />
電子書籍は一つのフォルダに300ページくらい入っているものがあって、全部のフルパスを指定していくとコマンドラインに出力する文字数が軽く10,000文字を超えてしまっていました。</p>
<p><a rel="noopener" href="https://support.microsoft.com/ja-jp/help/830473/command-prompt-cmd--exe-command-line-string-limitation" target="_blank">Microsoftのサポートページ</a>によるとコマンドラインで使用できる文字数は8,191文字で、超えた分がエラーになってしまいます。</p>
<p>出力できない場合があるのでこのコードは使用できず他の方法を検討しました。</p>
<h3><span id="toc6">私がLhaPlusを操作するのに使用したコード</span></h3>
<p>私がVBAに組み込んだコマンドラインのコードは以下の通りです。</p>
<div class="VBACode">Lhaplus.exe /c:zip /n:圧縮フォルダの名前（フルパス） /l:圧縮したいファイルを記載したテキストファイル名（フルパス）</div>
<p>「/n:」を使用して圧縮フォルダの名前を指定して、圧縮したいファイル名の一覧を記載したテキストファイルを「/l:」を用いて呼び出すことにしました。</p>
<p>圧縮したいファイル名の一覧はテキストファイルで、1行に1つのファイル名を記載しておくと呼び出して使用できるようになります。<br />
私はデスクトップに「圧縮リスト.txt」というファイルを作成してする手順でVBAコードを作りました。</p>
<h2><span id="toc7">VBAコード紹介</span></h2>
<p>私が作成したVBAコードは以下の通りです。<br />
デスクトップの「前」の中にあるフォルダをすべて「後」というフォルダに圧縮ファイルとして出力するコードです。</p>
<p>圧縮ファイルの中にはダイレクトにファイルが入っていて、通常のフォルダとほとんど同じ扱いで処理できるようになっています。</p>
<p>VBAでコマンドラインを操作する方法は<a href="https://officevba.info/vbapicturetrimming/" target="_blank">こちらの記事</a>を参考にしてください。</p>
<div class="VBACode">Sub zip変更5()<br />
</ br><br />
<span class="VBA_Tab1">Dim FSO As Object, WSH As Object</span><br />
<span class="VBA_Tab1">Dim Cmd(4) As String</span><br />
</ br><br />
<span class="VBA_Tab1">Dim 前FoldPath As String, 後FoldPath As String</span><br />
<span class="VBA_Tab1">Dim FolderName As String, FileName As String</span><br />
</ br><br />
<span class="VBA_Tab1">Dim ArrFileName As String, ArrFolderName() As String</span><br />
<span class="VBA_Tab1">Dim DesktopPath As String</span><br />
</ br><br />
<span class="VBA_Tab1">Dim i As Long, k As Long</span><br />
</ br><br />
<span class="VBA_Tab1">Set FSO = CreateObject(&#8220;Scripting.FileSystemObject&#8221;)</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
</ br><br />
<span class="VBA_Tab1">WSH.CurrentDirectory = &#8220;C:Program Files (x86)Lhaplus&#8221; <span class="VBA_Comment">’LhaPlusがあるフォルダをカレントディレクトリに指定する</span></span><br />
</ br><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">前FoldPath = &#8220;C:UsersmasahDesktop前&#8221; <span class="VBA_Comment">’圧縮したいフォルダを格納するフォルダを決定する。今回はデスクトップの「前」フォルダ</span></span><br />
<span class="VBA_Tab1">後FoldPath = &#8220;C:UsersmasahDesktop後&#8221; <span class="VBA_Comment">’圧縮したZipファイルを作成するフォルダをデスクトップの「後」に指定する。</span></span><br />
</ br><br />
<span class="VBA_Tab1">If FSO.Folderexists(後FoldPath) = False Then</span><br />
<span class="VBA_Tab2">FSO.CreateFolder 後FoldPath <span class="VBA_Comment">’「後」フォルダが存在しなければ作成する</span></span><br />
<span class="VBA_Tab1">End If</span><br />
</ br><br />
<span class="VBA_Tab1">If FSO.Fileexists(DesktopPath &#038; &#8220;圧縮リスト.txt&#8221;) = True Then</span><br />
<span class="VBA_Tab2">FSO.DeleteFile DesktopPath &#038; &#8220;圧縮リスト.txt&#8221; <span class="VBA_Comment">’デスクトップに圧縮リスト.txtというファイルがあれば削除する</span></span><br />
<span class="VBA_Tab1">End If</span><br />
</ br><br />
<span class="VBA_Tab1">i = 0</span><br />
<span class="VBA_Tab1">FolderName = Dir(前FoldPath &#038; &#8220;*&#8221;, vbDirectory)</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment0">’フォルダごとに中のファイルを圧縮していくがDirは入れ子にできないので、フォルダのパスを配列ArrFolderName()に格納</span></span><br />
<span class="VBA_Tab1">Do While FolderName <> &#8220;&#8221;</span><br />
<span class="VBA_Tab2">If Left(FolderName, 1) <> &#8220;.&#8221; Then</span><br />
<span class="VBA_Tab3">ReDim Preserve ArrFolderName(i)</span><br />
<span class="VBA_Tab4">ArrFolderName(i) = FolderName</span><br />
<span class="VBA_Tab3">i = i + 1</span><br />
<span class="VBA_Tab2">End If</span><br />
<span class="VBA_Tab1">FolderName = Dir()</span><br />
<span class="VBA_Tab1">Loop</span><br />
</ br><br />
<span class="VBA_Tab1">For k = 0 To i – 1 <span class="VBA_Comment">’フォルダの中のファイル名の一覧（ArrFileName）を作成する</span></span><br />
<span class="VBA_Tab2">ArrFileName = &#8220;&#8221;</span><br />
<span class="VBA_Tab2">FileName = Dir(前FoldPath &#038; &#8220;&#8221; &#038; ArrFolderName(k) &#038; &#8220;*.jpg&#8221;, vbNormal)</span><br />
<span class="VBA_Tab2">Do While FileName <> &#8220;&#8221;</span><br />
<span class="VBA_Tab3">If ArrFileName <> &#8220;&#8221; Then</span><br />
<span class="VBA_Tab4">ArrFileName = ArrFileName &#038; vbCrLf &#038; 前FoldPath &#038; &#8220;&#8221; &#038; ArrFolderName(k) &#038; &#8220;&#8221; &#038; FileName</span><br />
<span class="VBA_Tab3">Else</span><br />
<span class="VBA_Tab4">ArrFileName = 前FoldPath &#038; &#8220;&#8221; &#038; ArrFolderName(k) &#038; &#8220;&#8221; &#038; FileName</span><br />
<span class="VBA_Tab3">End If</span><br />
<span class="VBA_Tab2">FileName = Dir()</span><br />
<span class="VBA_Tab2">Loop</span><br />
</ br><br />
<span class="VBA_Tab2">With FSO.CreateTextFile(DesktopPath &#038; &#8220;圧縮リスト.txt&#8221;) <span class="VBA_Comment">’圧縮リスト.txtにArrFileNameを記載する</span></span><br />
</ br><br />
<span class="VBA_Tab3">.WriteLine ArrFileName</span><br />
<span class="VBA_Tab3">.Close</span><br />
<span class="VBA_Tab2">End With</span><br />
</ br><br />
<span class="VBA_Tab2">Cmd(0) = &#8220;Lhaplus.exe /c:zip /n:&#8221; &#038; 後FoldPath &#038; &#8220;&#8221; &#038; ArrFolderName(k) &#038; &#8220;.zip&#8221; &#038; &#8221; /l:&#8221; &#038; DesktopPath &#038; &#8220;圧縮リスト.txt&#8221;</span><br />
<span class="VBA_Tab2">WSH.Run &#8220;%ComSpec% /c &#8221; &#038; Cmd(0), 7, True</span><br />
<span class="VBA_Tab2"><span class="VBA_Comment0">’コマンドを実行する</span></span><br />
<span class="VBA_Tab2">FSO.DeleteFile DesktopPath &#038; &#8220;圧縮リスト.txt&#8221; <span class="VBA_Comment">’圧縮リストを削除する</span></span><br />
</ br><br />
<span class="VBA_Tab1">Next k <span class="VBA_Comment">’最後のフォルダまで繰り返す</span></span><br />
</ br><br />
<span class="VBA_Tab1">Set wdApp = Nothing</span><br />
<span class="VBA_Tab1">Set FSO = Nothing</span><br />
<span class="VBA_Tab1">Set WSH = Nothing</span><br />
</ br><br />
End Sub</div>
<p>デスクトップにもともと「圧縮リスト.txt」というファイルが存在していると強制的に削除してしまうので、その点だけは注意です。</p>
<p>指定するパスを変更すると出力前のフォルダ、出力後のフォルダなどを簡単に変更できます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/vbazipfile/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>DOSコマンドを使用してVBAで画像ファイルを編集する方法</title>
		<link>https://officevba.info/vbapicturetrimming/</link>
					<comments>https://officevba.info/vbapicturetrimming/#respond</comments>
		
		<dc:creator><![CDATA[okumasahito]]></dc:creator>
		<pubDate>Wed, 23 Nov 2016 11:57:42 +0000</pubDate>
				<category><![CDATA[DOSコマンドの実行]]></category>
		<guid isPermaLink="false">http://officevba.info/?p=847</guid>

					<description><![CDATA[目次 VBAでDOSのコマンドを使用する紹介するVBAコードで使用するアプリケーションDOSコマンドを実行するVBAメソッドDOSコマンドを実行するVBAのサンプルコード VBAでDOSのコマンドを使用する DOSのコマ [&#8230;]]]></description>
										<content:encoded><![CDATA[
  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-6" checked><label class="toc-title" for="toc-checkbox-6">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">VBAでDOSのコマンドを使用する</a></li><li><a href="#toc2" tabindex="0">紹介するVBAコードで使用するアプリケーション</a></li><li><a href="#toc3" tabindex="0">DOSコマンドを実行するVBAメソッド</a></li><li><a href="#toc4" tabindex="0">DOSコマンドを実行するVBAのサンプルコード</a></li></ol>
    </div>
  </div>

<h2><span id="toc1">VBAでDOSのコマンドを使用する</span></h2>
<p>DOSのコマンドを操作できるようになるとExcelやOutlook、Internet Explorer以外のアプリケーションでも操作できるものがあります。</p>
<p>私はDOSのコマンドを使用して画像の編集アプリを操作することで、たくさんある画像ファイルを一括でトリミングするのに使用しています。<br />
今回はこのDOSのコマンドを実行するVBAで画像ファイルを編集する方法を紹介します。</p>
<h2><span id="toc2">紹介するVBAコードで使用するアプリケーション</span></h2>
<p>IrfanViewというアプリケーションを使用します。</p>
<p>http://forest.watch.impress.co.jp/library/software/irfanview/でダウンロードできます。<br />
元々たくさんのファイルを同時に処理することに優れたアプリケーションですが、これをDOSコマンドで実行することでさらに自由度が高く便利に画像編集が可能になります。</p>
<h2><span id="toc3">DOSコマンドを実行するVBAメソッド</span></h2>
<p>DOSコマンドを実行するVBAのメソッドはRunとExecの2つがあります。</p>
<p>RunはDOSのウインドウを表示しないように設定したり、ウインドウを最大で表示したりすることができるのが大きなメリットです。</p>
<p>ExecはよりVBAとDOSを同期させるときに便利なコマンドで、出力結果をVBAで取得したりする場合にExecを使用する方が良いようです。</p>
<p>VBAでDOSコマンドの出力結果を取得する必要がない今回のケースのような場合、Runを用いておくと、プログラムの動作中にも他の作業ができるので便利になります。</p>
<h2><span id="toc4">DOSコマンドを実行するVBAのサンプルコード</span></h2>
<p>VBAでコマンドラインを操作して、IrfanViewを起動し、画像ファイルの拡張子を変更し、画像ファイルをトリミングして名前を変更するサンプルコードは以下のようになります。</p>
<p>デスクトップにある「編集前」というフォルダにある「a.png」というファイルをトリミングして「編集後」というフォルダに「b.jpg」というファイル名と形式に変更するサンプルです。</p>
<p>①Execを使用する</p>
<div class="VBACode">Sub DOSコマンドを実行する1()<span class="VBA_Comment">’Execコマンド使用</span><br />
<span class="VBA_Tab1">Dim wExec As Object, WSH As Object</span><br />
<span class="VBA_Tab1">Dim Cmd As String, DesktopPath As String</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">WSH.CurrentDirectory = &#8220;C:\Program Files (x86)\IrfanView&#8221;</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">Cmd = &#8220;i_view32.exe &#8221; &#038; DesktopPath &#038; &#8220;\編集前\a.png&#8221; &#038; &#8221; /crop=(0,100,1000,1500,)&#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8221; /convert=&#8221; &#038; DesktopPath &#038; &#8220;\編集後\b.jpg&#8221;</span><br />
<span class="VBA_Tab1">Set wExec = WSH.Exec(&#8220;%ComSpec% /c &#8221; &#038; Cmd)</span><span class="VBA_Comment">’&#8221;%ComSpec% /c &#8220;はコマンドラインの種類を特定するものです。そのまま記載すればOKです</span><br />
<span class="VBA_Tab1">Do While wExec.Status = 0</span><br />
<span class="VBA_Tab2">DoEvents</span><br />
<span class="VBA_Tab2">Sleep 1</span><br />
<span class="VBA_Tab1">Loop</span><br />
End Sub</div>
<p>②Run使用</p>
<div class="VBACode">Sub DOSコマンドを実行する2()<span class="VBA_Comment">’Runコマンド使用</span><br />
<span class="VBA_Tab1">Dim WSH As Object</span><br />
<span class="VBA_Tab1">Dim Cmd As String, DesktopPath As String</span><br />
<span class="VBA_Tab1">Set WSH = CreateObject(&#8220;Wscript.Shell&#8221;)</span><br />
<span class="VBA_Tab1">WSH.CurrentDirectory = &#8220;C:\Program Files (x86)\IrfanView&#8221;</span><br />
<span class="VBA_Tab1">DesktopPath = WSH.SpecialFolders(&#8220;Desktop&#8221;)</span><br />
<span class="VBA_Tab1">Cmd = &#8220;i_view32.exe &#8221; &#038; DesktopPath &#038; &#8220;\編集前\a.png&#8221; &#038; &#8221; /crop=(0,100,1000,1500,)&#8221; &#038; _</span><br />
<span class="VBA_Tab3">&#8221; /convert=&#8221; &#038; DesktopPath &#038; &#8220;\編集後\b.jpg&#8221;</span><br />
<span class="VBA_Tab1">WSH.Run &#8220;%ComSpec% /c &#8221; &#038; Cmd, 7, True</span><br />
<span class="VBA_Tab1"><span class="VBA_Comment">’Runメソッドの引数「7」にすると最小化して起動。「1」が通常のウインドウ表示、「3」が最大化</span></span><br />
End Sub</div>
<p>DOSコマンドに指令を出す部分は変数を使うこともできますので、変数を使用してたくさんのファイルに一括で処理を実行することができます。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://officevba.info/vbapicturetrimming/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
