[[20081023153339]] 『エクセルで一覧にしたxdwファイルを印刷』(えびあん) ページの最後に飛ぶ

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

 

『エクセルで一覧にしたxdwファイルを印刷』(えびあん)

 [エクセルのバージョン]Excel2003
 [OSのバージョン]WindowsXP

 プロフェッショナルの皆様のお知恵をお借りしたく、お世話になります。
 よろしくお願いします。
 エクセルで拡張子xdwファイル(ドキュワークス)をE列に一覧にしてあるのですが、
 マクロか何かでE列と同じファイル名のものを指定したフォルダより
 次々印刷できる方法などはないのでしょうか?
 今はハイパーリンクをして、ひとつづつ開いて手動で印刷しているのですが、
 一覧の内容が30も40もあるものが複数あり、ちょっと遠い目になりつつあります…

 便利な方法、ありませんか・・・?

 大前提 

 1 VBAを使えば、まあ可能です。よって、この知識が多少なりともある。

 2 そのxdwファイルなるもの(私は初めて知ったので)を対象フォルダから選択し、右クリックしたときに
   表示されるポップアップメニューの中に 印刷(P) と表示される機能が存在する

 私が知っている方法で可能です。
 「指定したフォルダより 次々印刷できる方法」これは、E列に列挙されているファイルは、別々のフォルダ
 に あるということですか? それとも全て同一フォルダにあるファイルですか?

 それとも 指定されたフォルダに存在するファイルの中でE列に列挙されたファイル名と一致するものを
 印刷したいということですか?

 つまり、細かい仕様を記述してください。

 ichinose


 前投稿の条件を満たすならば・・・、

 標準モジュールに

 '=============================================================
 Sub main()
    Dim fso As Object
    Dim ff As Object
    Dim ffi As Object
    With CreateObject("Shell.Application")
       Set ff = .NameSpace("C:\Documents and Settings\デスクトップ\testfold")
 '                                  ↑印刷対象のxdwファイルがあるフォルダ名を指定する
    End With
    Set fso = CreateObject("scripting.filesystemobject")
    For Each ffi In ff.items
       If ffi.IsFileSystem And (Not ffi.IsFolder) _
          And LCase(fso.GetExtensionName(ffi.Name)) = "xdw" Then
             ffi.InvokeVerb "印刷(&P)"
             End If
       Next
    Set ffi = Nothing
    Set ff = Nothing
 End Sub

 上記コードは、指定されたフォルダ内にあるxdwファイルを印刷するコードです。
 私は、ドキュワークスなるアプリを持っていませんので上記コードのテストは、pdfファイル(Acrobat)で
 確認しました。

 ichinose


 質問者ではありませんが、
 ドキュワークスまたは、ドキュワークスビューワがインストールされていれば
 きちんと印刷されました。

 (川野鮎太郎)


 ichinose様
 お返事が遅くなりすみません。
 回答ありがとうございます!
 私の言葉足らずですみません。

 「記録」という同一フォルダにxdwファイルがまとめて収納されています。
 ブック名「処理済み」シート「●●処理」のE列は、フィルタで選別して表示させています。
 「記録」フォルダ内のファイルとE列で表示したファイル名と一致しているものだけを
 次々と印刷したいです・・・

 あ!申し上げておいたほうが良いと思うので書きます。
 E列にファイル名で書かれていてもxdwファイルがない場合があります。
 一致しないファイル名はスルーして次の処理へで問題ありません。
 (一致しないファイルがどれかは事前にわかるのですが、
  E列には表示されていなくてはならなくて、排除できないのです…)

 川野鮎太郎様
 確認ありがとうございます。
 インストールはしてあるので大丈夫です。

 (えびあん)


 まず、川野鮎太郎さん、確認ありがとうございます。

 で、

 E列の1行目が項目名で2行目から対象ファイル名が入力されているものとします。
 その上でフィルタリングされているとして・・・。

 E列のファイル名は

 例えば aaa.xdw    zzzzz.xdw  等と記述されているとします。

 標準モジュールに
 '=======================================================================
 Sub main()
    Dim fso As Object
    Dim ff As Object
    Dim ffi As Object
    Dim Rng As Range
    Dim myarray As Variant
    Set Rng = Range("e1", Cells(Rows.Count, "e").End(xlUp))
    If Rng.Count > 1 Then
       myarray = get_array(Rng)
       With CreateObject("Shell.Application")
          Set ff = .NameSpace("C:\Documents and Settings\デスクトップ\testfold")
 '                                  ↑印刷対象のxdwファイルがあるフォルダ名を指定する
          End With
       Set fso = CreateObject("scripting.filesystemobject")
       For Each ffi In ff.Items
          If ffi.IsFileSystem And (Not ffi.IsFolder) _
             And LCase(fso.GetExtensionName(ffi.Name)) = "xdw" _
             And Not IsError(Application.Match(ffi.Name, myarray, 0)) Then
                ffi.InvokeVerb "印刷(&P)"
                End If
          Next
       Set ffi = Nothing
       Set ff = Nothing
       Set fso = Nothing
       End If
 End Sub
 '=============================================================================
 Function get_array(Rng As Range, Optional except As Long = 1) As Variant
    On Error Resume Next
    Dim rngA As Range
    With CreateObject("scripting.dictionary")
       For Each rngA In Rng
          If rngA.Row <> except Then
             .Item(rngA.Value) = ""
             End If
          Next
       get_array = .Keys
       End With
 End Function

 ichinose


 ichinose様

 ありがとうございます、できました!
 ですが、少し伺いたい事があります。

 E列は確実にxdwファイルだけなのです。
 ファイル名とは拡張子は含んでいるものをいうのですね…
 私の認識不足でした。 
 書いて頂いたコードのように拡張子まで入力しないと
 次々印刷というのは無理なのでしょうか?
 私は拡張子なしでE列で入力しているのですが、
 それを元に他の処理に繋げているのもあり、
 出来ましたら拡張子なしのままでなんとかしたいのですが
 折角書いて頂いたコードは大幅に変更しないとならなくなりますか?

 (えびあん)

 先にコード

 '======================================================
 Sub main()
    Dim fso As Object
    Dim ff As Object
    Dim ffi As Object
    Dim Rng As Range
    Dim myarray As Variant
    Set Rng = Range("e1", Cells(Rows.Count, "e").End(xlUp))
    If Rng.Count > 1 Then
       myarray = get_array(Rng)
       With CreateObject("Shell.Application")
          Set ff = .NameSpace("C:\Documents and Settings\デスクトップ\testfold")
 '                                  ↑印刷対象のxdwファイルがあるフォルダ名を指定する
          End With
       Set fso = CreateObject("scripting.filesystemobject")
       For Each ffi In ff.Items
          If ffi.IsFileSystem And (Not ffi.IsFolder) _
             And LCase(fso.GetExtensionName(ffi.Name)) = "xdw" _
             And Not IsError(Application.Match(fso.getbasename(ffi.Name), myarray, 0)) Then
 '                          ↑追加しただけ・・・
                ffi.InvokeVerb "印刷(&P)"
                End If
          Next
       Set ffi = Nothing
       Set ff = Nothing
       Set fso = Nothing
       End If
 End Sub

 もちろん、先に投稿したFunction get_arrayは、そのまま使います。

 これで、E列のデータに拡張子xdwがなくても(ベース名と言ったっけ)作動するはずです。

 が、

 最初にE列のデータ例を2、3例記述さえしてくれれば、こんな回り道をしなくても済んだと思いますよ!!

 ここのサイトの過去の質問でも、
 この例を記述しないがためにスレッドが長くなっている質問が少なくありません。

 プログラムには、仕様書(またはマニュアル)が必要です。これ、結構面倒ですが、
 ここできちんと質問することで、その仕様書をわかりやすく書く練習にはなりますよ!!

 ichinose


 ichinose様

 ありがとうございます、連続印刷出来ました。
 そして私がファイル名だと思っていたのは「ベース名」というのですね…
 覚えておきます。

 私の認識・記述不足で何度もお手間をお掛けして
 本当にすみませんでした。
 面倒だから…と記載しなかったのではないのですが、
 質問するからには回答者の皆様に回答しやすい質問をする為に
 何が必要・不要な情報かは質問者側(私)が判断するのではなく、
 より多い情報を最初から明記すべきでした。
 反省し、以後気をつけます。

 (えびあん)

コメント返信:

[ 一覧(最新更新順) ]


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