性格いい人が優勝

エクセルのマクロについて教えてください。エクセル2010でセルをダブルクリックすると、同一フォルダ内のPDFファイルデータを表示するというマクロを作ってもらったのですが、保存する際に「次の機能はマクロ無しのブックに保存できません・VBプロジェクト~」と表示されExcelマクロ有効ブック(拡張しxlsm)に替えて保存するとマクロのコード自体は残っているのですが、Not find fileと出てしまいます。また最初からExcelマクロ有効ブックでコードを入力しても同様の結果になります。このような場合どのように保存すればいいのでしょうか?

ちなみにコードは下記のようになります。
'Option Explicit
'Private Const pdfPATH As String = "D:\5678\"
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 Cancel = True
 If Not Target.Value Like "*.pdf" Then Exit Sub
 If Dir(pdfPATH & Target.Value) = "" Then MsgBox "File Not Found": Exit Sub
 With CreateObject("Wscript.Shell")
  .Run "" & pdfPATH & Target.Value & "", 3
 End With
End Sub

A 回答 (5件)

#3さんへ



こんばんは。

>1.「'Private Const pdfPATH As String = "D:\5678\"」の行は消す
>2.次のマクロに差し変える



読ませていただきました。(どちらかというと、笑ってしまいました……^^;。)

とても残念な回答です。ずいぶん回答をなさっている方とお見受けしましたから、こんな初歩的な内容を「間違いだ」と言って理解できないというのでは、ちょっと驚いています。

一応、お分かりの方は言うまでもありませんが、お返事だけはしておきます。

1.は、コメントアウトしたものが、間違いだとか、消す・消さないということは、イベント・ドリブン型のコードにとって関係ありませんね。それは、コードを残したのは私の親切心からです。

コメントアウトで残した理由は、本来、ご質問にあったもので、それを決め打ちで、フォルダを設定しておいたほうがよいと考えたけれども、同じフォルダだということで、どちらでも可能なように作ったのです。ご質問者様が分かると思って、置いておいたのですが、ご質問者さんは、通じていなかったようです。

2.は、ThisWorkbookフォルダにPdf ファイルがあれば、
 pdfPATH As String = ThisWorkbook.Path & "\"
と書く必要はありません。もともと、そのように出来ています。

ご質問者さんの返事はすでに書きましたが、前回書いたように2つの点しかありません。
ファイル名が違うか、同じフォルダにないのか、という点です。

ご質問者さんが、きちんと理解する前に新たに質問するということをしたせいで、こんなちぐはぐなことになってしまいした。とはいえ、私も常に返事を付けるとは限りませんので、それはご容赦願いたいです。私にお礼につけた内容なら、遅くなっても返事は付けますが、ある程度の内容なら、誰しもが同じような正答をしてもらう掲示板であるとよいのですが……。以前の常連さんたちは、ほとんど1・2名をのぞき、一掃してしまったようです。

なお、指摘回答として、違反事項に当たる可能性があるので、削除されるかもしれません。
    • good
    • 0
この回答へのお礼

Wind Faller様
私の理解不足、無知、また勉強不足により、大変ご迷惑をおかけしたことをお詫びさせていただきます。Wind Faller様がご親切に教えていただいたことを理解できておらず、すみませんでした。おそらくNO4の方の回答と同じ事をご指摘いただいていたにもかかわらず、私が理解していなかったのだと痛感しております。今後ともよろしくお願いいたします。

お礼日時:2012/11/20 16:53

横から失礼します。


他人に聞き、丸のままコピーペーストするのは構いませんが、
「何をするための文なのか」ちゃんと理解して使わないと応用は出来ませんよね。
そんな良い例だと、自戒なさってください。



失礼ながらWindFallerさまの以前の回答を引用させていただきますが
~~引用~~
>> 「デスクトップ上の1同じフォルダ内」-
>> つまり、PDFファイルと、ワークブックが同じフォルダー内なら、
>> 以下のPrivate Const の登録は不要です。
>> 違う場合は、以下のように、例 "D:\5678\"と入れます。
~~以上、引用~~
ここはちゃんと読んで、この文章とコード内容を理解されましたか?

要するに、
> またエクセルとPDFデータはデスクトップ上の同じフォルダ内(フォルダ名5678)にあります。
なのだから、Private Const でフォルダ名を登録する必要は無いのです。

つまり、
ここに関しては、質問者さまの「理解度」の問題100%です。
> マクロの内容そのものに問題があります。
なんてことは一切ありません。
根拠は後ほど。



あえて現状のエラー要因を挙げるとしたら、
> またエクセルとPDFデータはデスクトップ上の同じフォルダ内(フォルダ名5678)にあります。
> Private Const pdfPATH As String = "C:\5678\"
ここで引っかかってるんじゃないでしょうか?
「デスクトップ上のフォルダ」なら、Cドライブ直下という事は無いですよね。
「デスクトップ上のフォルダ」を右クリック→プロパティで「場所」をもう一度確認してみてくださいませ。
   例)C:\Users\UserName\Desktop\5678\ など
確認したら、ソレを以て書き直して、もう一度走らせてみてください。
多分、ソレでうまく動きます。





さて。

以前のバージョンでの確認はしていませんが、
2010では起動中、直近最後に開いたファイルのパスをデフォルトに持ちます。
ブックが開かれた状態で「ファイルを開く」ダイアログを開くと
最後に開いたブックと同じフォルダをまず表示します。
(エクセルを再起動すると、「既定のファイルの場所」に戻ります。)

なので、
「マクロを登録しているブックを開いた後に、別の場所からブックを開かない」なら
Private Const による設定も、マクロ内での Set も不要、という事です。

これが逆に
「マクロを登録しているブックを開いた後に、別の場所からブックを開き、
 そのあとで改めてPDFを開くマクロを実行させる可能性がある」なら
マクロ動かす段で改めて Private Const による設定か、マクロ内での Set か
どちらかをしないと、ファイルが見つからないと言うエラー表示が出ます。


どちらも「合っている」が、「使い分けは必要」と言えると思います。
私個人としては、パスは(面倒でも)いちいち指定する方を好みますが。

以上、根拠として付け加えておきます。
    • good
    • 0
この回答へのお礼

tsubuyuki 様
 おっしゃる通り、私の理解不足、無知によるところであった事を強く認識しました。また仕事の都合上時間に迫られていたため、自らで勉強する過程が不足(やっているつもりだったのですが)していたと大いに反省しております。さてマクロですがtsubuyaki様のご指摘通りにしたら、正常に作動しました。ありがとうございました。本来であればベストアンサーとさせていただかなければならないのかしれませんが、マクロをつくっていただいた過程(実に親切に教えていただきました。)、おそらく同様の事を指摘していただいていたにもかかわらず私が理解していなかったこと、様々な事からご迷惑をおかけしたという経緯から鑑みて、Wind Faller様の回答をベストアンサーとさせていただきたく、ご了解のほどをお願いいたします。今後ともよろしくお願いいたします。

お礼日時:2012/11/20 16:52

元のご相談の状態での間違いは


>'Private Const pdfPATH As String = "D:\5678\"

この文の先頭に「’」を付けていることです。



現在の間違いは

>エクセルとPDFデータはデスクトップ上の同じフォルダ内(フォルダ名5678)にあります。

に対して,マクロが正しく書けていない点です。


例えば次のように修正します。
1.「'Private Const pdfPATH As String = "D:\5678\"」の行は消す
2.次のマクロに差し変える

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
’以下追記
 dim pdfpath as string
 pdfpath = thisworkbook.path & "\"
’ここまで

 Cancel = True
 If Not Target.Value Like "*.pdf" Then Exit Sub
 If Dir(pdfPATH & Target.Value) = "" Then MsgBox "File Not Found": Exit Sub
 With CreateObject("Wscript.Shell")
  .Run "" & pdfPATH & Target.Value & "", 3
 End With
End Sub

この修正は,「エクセルとPDFを同じフォルダに放り込んである」が前提です。フォルダはどこに置いてあっても構いません。
    • good
    • 0

補足します。



少なくとも、ご質問者様は、一度は試してみたのだと思います。

#7805199の中で、
>マクロの内容そのものに問題があります。ブックの保存形式の問題ではありません。

私のマクロの問題だと書いた回答者がいますが、一体、どこの問題でしょう。私にも教えてほしいですね。こちらのマクロが、そんなに根拠なく指摘を受けるほどのヘボな内容だとは思いません。もし間違っているなら、きちんと言ってほしいですね。

よしんば、
CreateObject("Wscript.Shell")
が動かないというなら理解できますが、

Dir(pdfPATH & Target.Value) = ""
ということは、まずありえないのです。ファイルがないというのは、フォルダの問題か、ファイル名が正しく書かれていないか、いずれかであって、そう簡単に、マクロの問題と言われる筋合いではないと思います。
    • good
    • 0

こんばんは。



マクロの作者です。


そのメッセージは、
[If Dir(pdfPATH & Target.Value) = "" Then MsgBox "File Not Found": Exit Sub]
 
ここからのものですが、そのブックと、pdf ファイルとは、同じフォルダにあるのですか?

そこを確認してください。もし違うようなら、保存してブックのファイルは別の場所かもしれませんから、

'Private Const pdfPATH As String = "D:\5678\"
この部分を

Private Const pdfPATH As String = "D:\5678\"
先頭の(')コメントブロックを外して、pdf のある場所に設定してみたら、どうでしょうか。

この回答への補足

何度も申し訳ありません。下記のようにコードを替えたのですが、うまく作動しません。またエクセルとPDFデータはデスクトップ上の同じフォルダ内(フォルダ名5678)にあります。
Private Const pdfPATH As String = "C:\5678\"
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel = True
If Not Target.Value Like "*.pdf" Then Exit Sub
If Dir(pdfPATH & Target.Value) = "" Then MsgBox "File Not Found": Exit Sub
With CreateObject("Wscript.Shell")
.Run "" & pdfPATH & Target.Value & "", 3
End With
End Sub

補足日時:2012/11/19 18:08
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!