エクセルマクロの保存

このQ&Aのポイント
  • エクセル2010でセルをダブルクリックすると、同一フォルダ内のPDFファイルデータを表示するマクロの保存方法
  • マクロを保存する際に「次の機能はマクロ無しのブックに保存できません・VBプロジェクト~」と表示される理由と対処法
  • Excelマクロ有効ブックでコードを入力しても保存後にNot find fileと表示される場合の対処法
回答を見る
  • ベストアンサー

エクセルマクロの保存

エクセルのマクロについて教えてください。エクセル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

質問者が選んだベストアンサー

  • ベストアンサー
回答No.5

#3さんへ こんばんは。 >1.「'Private Const pdfPATH As String = "D:\5678\"」の行は消す >2.次のマクロに差し変える ・ ・ 読ませていただきました。(どちらかというと、笑ってしまいました……^^;。) とても残念な回答です。ずいぶん回答をなさっている方とお見受けしましたから、こんな初歩的な内容を「間違いだ」と言って理解できないというのでは、ちょっと驚いています。 一応、お分かりの方は言うまでもありませんが、お返事だけはしておきます。 1.は、コメントアウトしたものが、間違いだとか、消す・消さないということは、イベント・ドリブン型のコードにとって関係ありませんね。それは、コードを残したのは私の親切心からです。 コメントアウトで残した理由は、本来、ご質問にあったもので、それを決め打ちで、フォルダを設定しておいたほうがよいと考えたけれども、同じフォルダだということで、どちらでも可能なように作ったのです。ご質問者様が分かると思って、置いておいたのですが、ご質問者さんは、通じていなかったようです。 2.は、ThisWorkbookフォルダにPdf ファイルがあれば、  pdfPATH As String = ThisWorkbook.Path & "\" と書く必要はありません。もともと、そのように出来ています。 ご質問者さんの返事はすでに書きましたが、前回書いたように2つの点しかありません。 ファイル名が違うか、同じフォルダにないのか、という点です。 ご質問者さんが、きちんと理解する前に新たに質問するということをしたせいで、こんなちぐはぐなことになってしまいした。とはいえ、私も常に返事を付けるとは限りませんので、それはご容赦願いたいです。私にお礼につけた内容なら、遅くなっても返事は付けますが、ある程度の内容なら、誰しもが同じような正答をしてもらう掲示板であるとよいのですが……。以前の常連さんたちは、ほとんど1・2名をのぞき、一掃してしまったようです。 なお、指摘回答として、違反事項に当たる可能性があるので、削除されるかもしれません。

yu3841
質問者

お礼

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

その他の回答 (4)

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.4

横から失礼します。 他人に聞き、丸のままコピーペーストするのは構いませんが、 「何をするための文なのか」ちゃんと理解して使わないと応用は出来ませんよね。 そんな良い例だと、自戒なさってください。 失礼ながら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 か どちらかをしないと、ファイルが見つからないと言うエラー表示が出ます。 どちらも「合っている」が、「使い分けは必要」と言えると思います。 私個人としては、パスは(面倒でも)いちいち指定する方を好みますが。 以上、根拠として付け加えておきます。

yu3841
質問者

お礼

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

  • keithin
  • ベストアンサー率66% (5278/7940)
回答No.3

元のご相談の状態での間違いは >'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を同じフォルダに放り込んである」が前提です。フォルダはどこに置いてあっても構いません。

回答No.2

補足します。 少なくとも、ご質問者様は、一度は試してみたのだと思います。 #7805199の中で、 >マクロの内容そのものに問題があります。ブックの保存形式の問題ではありません。 私のマクロの問題だと書いた回答者がいますが、一体、どこの問題でしょう。私にも教えてほしいですね。こちらのマクロが、そんなに根拠なく指摘を受けるほどのヘボな内容だとは思いません。もし間違っているなら、きちんと言ってほしいですね。 よしんば、 CreateObject("Wscript.Shell") が動かないというなら理解できますが、 Dir(pdfPATH & Target.Value) = "" ということは、まずありえないのです。ファイルがないというのは、フォルダの問題か、ファイル名が正しく書かれていないか、いずれかであって、そう簡単に、マクロの問題と言われる筋合いではないと思います。

回答No.1

こんばんは。 マクロの作者です。 そのメッセージは、 [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 のある場所に設定してみたら、どうでしょうか。

yu3841
質問者

補足

何度も申し訳ありません。下記のようにコードを替えたのですが、うまく作動しません。またエクセルと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

関連するQ&A

  • エクセルのマクロコードに付いて教えて下さい。

    下記のマクロコードがありますが、 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With End Sub セル位置の指定を変更する場合は、どの様に 書けば良いのですか? このコードですと、セルA1の入力指定でなっていますが A1~A5までとか。A1、B1,C1とかにする場合はどの様に 書けば良いか教えて下さい。 マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • マクロの保存

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

  • エクセル VBAマクロ if文 はどうすれば?

    先ほど質問したのですが、さらにわからなくなったのでお願いします 先ほどの質問 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ http://okwave.jp/qa/q7236338.html >変数と式の両立は難しいでしょうからどうすればよいのでしょう?  ⇒関数では出来無いのはエクセルの常識ですのでマクロ(VBA)組込みになります。 一例です。 対象シートタブ上で右クリック→コードの表示→以下のコード貼り付けてA1に枚数を入力して お試しください。 サンプルコード Private Sub Worksheet_Change(ByVal Target As Range) 単価 = 5 If Intersect(Target, Range("A1")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then  Application.EnableEvents = False  Target.Value = Target.Value * 単価  Application.EnableEvents = True End If End Sub ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↓変更&応用したのですが、、、、 EX:(セル)    セル番号  用紙種類1~3       用紙種類    C12   A3モノクロ1     D12  A3カラー1    C13   A3モノクロ2     D13  A3カラー2    C14   A3モノクロ3     D14  A3カラー3 ※金額の違いは、モノクロとカラーの値段が違うだけ  1~3は金額的な違いはない とあった場合、 ためしに先ほどのを応用して用いたのですが 変更点は、用紙サイズ、カラーの有無による金額        出力先セルの番号 Private Sub Worksheet_Change(ByVal Target As Range) を Private Sub A4_mono_1(ByVal Target As Range) Private Sub A4_mono_2(ByVal Target As Range) ・             ・            ・ と変更したのですがうまく動作しなかったのですが、 どういった点が悪かったのでしょうか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 最終的な質問↓ 上記のものはVBAマクロ文は基本1つのみなので、if文で作らなくてはいけないということが分かったのですが、そこでさらに疑問が浮かびました、 Private Sub Worksheet_Change(ByVal Target As Range) If or(target.columns = C12:C14) Then 単価1 = 7.6 If Intersect(Target, Range("C12:C14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価1 Application.EnableEvents = True単価1 = 7.6 elseif or(target.columns = D12:D14) Then 単価2 = 30.6 If Intersect(Target, Range("D12:D14")) Is Nothing Then Exit Sub If IsNumeric(Target.Value) And Target.Value > 0 Then Application.EnableEvents = False Target.Value = Target.Value * 単価2 Application.EnableEvents = True End If End Sub としたっ場合全く式になっていません どのようにすればよいのでしょう?

  • エクセルのマクロコードについて

    エクセルのマクロコードに付いて教えて下さい。 下記のマクロコードがありますが、 Option Explicit ' Private Sub Worksheet_Change(ByVal Target As Range) '   Static Memo(1 To 3) As Long   Dim Cell As Range '   If Intersect([A1:C1], Target) Is Nothing Then     Exit Sub   End If '   For Each Cell In Target '     If Cell = "" Then       Memo(Cell.Column) = 0     End If   Next Cell   Set Cell = Target(1) '   If Not IsNumeric(Cell) Or Cell = "" Then     Exit Sub   End If '   Application.EnableEvents = False   Memo(Cell.Column) = Memo(Cell.Column) + Target   Target = Memo(Cell.Column)   Application.EnableEvents = True End Sub セル位置の指定を変更する場合は、どの様に書けば良いのですか? このコードですと、セルA1からc1の入力指定でなっていますが A1からAA1までとかにする場合やA1の結果を、A1ではなくA2に表示B1の結果をB2に表示する場合はどのように書くのでしょうか? マクロに付いて、殆ど知識が無いものですので 出来れば、分かり易い説明でお願いします。 宜しくお願いします。

  • エクセルのマクロ

    セルの値が変わったら動くマクロですが、2つ書くとエラーが出ます。 どのように直したらいいでしょうか? Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address If Intersect(Target, Range("EK22")) Is Nothing Then Exit Sub Else Range("EK24:EM28").Select Selection.ClearContents End If End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("EK24")) Is Nothing Then Exit Sub Else Range("EK27:EM28").Select Selection.ClearContents End If End Sub

  • エクセル 加算 

    1つのセルに数字を入力すると加算されているマクロを探していたら 以下の回答がありました Dim memo Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value <> "**" And IsNumeric(Target.Value) = False Then Exit Sub Application.EnableEvents = False If Target.Value = "**" Then memo = 0 Else memo = memo + Target.Value End If Target.Value = memo Application.EnableEvents = True End Sub このマクロですがA1に入力した場合に適用しますが、このマクロをたとえばA1からC1の範囲で使用した1場合にどのようなマクロをすればよいかわかりません それか、このマクロではそのようなことができるのかもわかりませんので教えて頂けないでしょうか

  • エクセルのマクロコードについて

    お世話になります。 下記コードで、セルごとにクリアをすると、エラーなくうごくのですが、セルをまとめてセルを消すと実行時エラー13型が一致しません。とでてIf Target.Value = "" Thenがだめだよとでてしまいます。 どなたか、回避の方法をご教授ください。 宜しくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2:E2,G2:J2")) Is Nothing Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo 'Range("B2").Value = x + Z Z = Target.Offset(1, 0).Value y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With Target.Offset(1, 0).Value = x + Z End Sub

  • 2つのマクロを挿入すると動作せず

    現在、C10に値が入力されるとG4に発行日が表示される 下記のマクロを入力しています。 1 発行日の日付 Option Explicit Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub この上のマクロのみは上手く作動しています。 ファイル名を自動で保存するために下記のマクロをしたいので追加しました。 2 ファイル名の自動保存   Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If End Sub 3  上記の1+2で下記の如くし、いろいろトライをしていますが 上手くゆきません。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row = 1 And Target.Column = 1 Then ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If If Target.Address = "$C$10" Then Target.Offset(-6, 2).Value = Date End If End Sub ブック内は次のようなファイルです。 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file)  ここのA1に保存したいファイル名を入れています。 上手く表示されません。 困っています。 ここでご教授いただきたいのは 2のみのマクロだと問題なく「ファイル名とシート名」が自動的に表示され保存ができます。 私のやり方に何か問題があると思います。 上記の1(発行日の日付け)+2(ファイル名の自動保存)したときにはうまくいかず何かいい方法がないでしょうか。 お知恵をお貸し下さい。

  • ある条件を加えてもマクロをちゃんと動かしたい

    Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long If Target.Count <> 1 Then Exit Sub If Not IsNumeric(Target.Value) Then Exit Sub If Target.Value <> 1 Then Exit Sub If Intersect(Target, Range("W:W, AC:AC, AQ:AQ, AW:AW")) Is Nothing Then Exit Sub i = Target.Column - 6 ' Debug.Print Target.Address & " " & Target.End(xlToLeft).Column If i < 1 Then Exit Sub Target.Offset(0, i - Target.Column).Resize(1, 5).Copy Application.EnableEvents = False Target.PasteSpecial Paste:=xlPasteAll Application.CutCopyMode = False Application.EnableEvents = True Target.Select end sub 上のコードはW列、AC列、AQ列、AW列に1と入力すると、入力セルから みて6つ左から5つのデータがコピーされるマクロです。ここでAK列、BE列からみて8つ左から5つのデータをコピーする 条件を付加したいのですがうまくいきません。 If Intersect(Target, Range("AK:AK, BE:BE")) Is Nothing Then Exit Sub i = Target.Column - 8 ' ↑ このコードを追加する感じです。  この条件を付加しなければうまく動くのですが、付加して何とか動かしたいと考えています。 何か良い方法があればおしえていただけると幸いです。

  • マクロ エクセル2003

    いつも回答して頂き感謝しています。 原紙のブックを開き、別の名前を付けて保存するマクロを考えています。 原紙のブックを開くマクロはネットから探して、少し修正して出来あがったのですが、 この開いた原紙のブックに別の名前を付けて保存するマクロで困っています。 ただ単に名前を付けるだけだったら問題無いのですが、 その名前が既に保存されていないか確認した後、保存としたいのです。 ブックを開く記述を少し引用して出来ないかやってみたのですが、 Const Target2 As String = "C:\Users\Owner\Documents\" & NewFile で、定数式が必要です。と表示されエラーが発生してしまいます。 どのように変更したら上手くいくのでしょうか?宜しくお願い致します。 Sub Sample() Dim buf1 As String Dim buf2 As String Dim NewFile As String Dim ws1 As Worksheet Dim wb As Workbook Set ws1 = ThisWorkbook.Worksheets("作成") NewFile = "借入貸出" & ws1.Range("C4").Value & "." & ws1.Range("D4").Value Const Target1 As String = "C:\Users\Owner\Documents\借入貸出原紙.xlsx" Const Target2 As String = "C:\Users\Owner\Documents\" & NewFile & ".xlsx" buf1 = Dir(Target1) If buf1 = "" Then MsgBox Target1 & vbCrLf & "は存在しません", vbExclamation Exit Sub End If For Each wb In Workbooks If wb.Name = buf1 Then Application.DisplayAlerts = False Workbooks("借入貸出原紙.xlsx").Close Application.DisplayAlerts = True End If Next wb Workbooks.Open Target1 buf2 = Dir(Target2) If buf2 = "" Then End If End Sub

専門家に質問してみよう