- ベストアンサー
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(ファイル名の自動保存)したときにはうまくいかず何かいい方法がないでしょうか。 お知恵をお貸し下さい。
- みんなの回答 (10)
- 専門家の回答
質問者が選んだベストアンサー
n-junです。 #4の補足にある、 >2は新たにエクセルを起ち上げシート1 A1 (仮にABCを)に値を入れるとすぐに シート名がSheet1名とファイル名がABC になり変わります。 >1と2にするとなりません。 と言う事から、今いじっているブックではなく他の原因なのかな?って感じがします。 ただその原因を突き詰める方法はわかりません。 私はOS:Win Excel:2002で元々の質問で提示されているコードでも 問題なく動いている感じです。 ⇒それが質問者さんの希望とあうのかどうかはわかりませんが、セルに入力した データを基にシート名変更とファイル保存は出来てます。
その他の回答 (9)
- Wendy02
- ベストアンサー率57% (3570/6232)
#6 の回答者です。 >最初にSheet1で保存のマクロを作成してその後に納品 請求書等を作成すればいいみたいです。 さっぱり分からなくなりました。 「最初にSheet1で保存のマクロを作成」 私は、ActiveSheet と Sheet8 と区別を書いているはずです。こちらの書いたものはどうなってしまったのでしょう。こちらがダメだったので、他人に頼るということなのでしょうか。何がどうなったのか、私には分かりません。 #1のn-jun様のご質問は、まだ生きています。 >・この様にしたいけど、実際はこの様になってしまう。 >・この様なはずではないが、こうなってしまう。 >・シートが複数あって、1と2が同じシートイベントで良いのか、違うのか。 >等具体的にされた方がいいかもですよ。 今になって条件が変わるということですと、もともと、マクロ全体の設計にも疑問を感じるところにきて、書き直させられるのは、もうできません。 >ただし上にも書かせていただきましたが1回のみが良くて複数回がだめです。 こちらの条件にあっているなら、ダメだということはありえません。ただし、ある程度のマクロ経験者は、そのようなコードは、作らないと思います。 最初から、どこのシートのどこのセル何を書いて、そのブックを保存したいとか、「マクロ作成依頼」ならともかく、今だ、どこのシートのイベントでさえ、こちらは分かりませんから、その上で、「ダメだった」と繰り返されても、こちらでは意味が分かりません。どうやら、#5で書いたデバッグの方法は試されていないようです。 おそらく、こちらが書いたものを書き直しているのか、それとも、セルやシートの位置関係を自分なりの解釈で、そのまま使っているのか、それとも、シート名とオブジェクト名の意味を理解していないままに使っているのか、いずれかだと思います。 発想だけでここに質問されたものだと思います。もう少し、前提となる条件をきちんとまとめたほうがよろしいのではありませんか。これ以上は、このままでは無理だと思ったほうがよいと思います。少なくとも、今回の初心者用のマクロとは言えない上に、無理がありますから、ご自身でなんとかしようと思わず、ゲタを預けて、きちんとした要件を書いて「マクロ作成依頼」に切り替えたほうが良いように思います。
お礼
自分で何とか試行錯誤の上、解決策を見いだしました。 スマートでない方法かも知りませんがご報告します。 従来のブック内容が、 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file)※ここのA1に「付けたいファイル名」をまとめました。 で自動保存のマクロを挿入したSheet9、 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 を追加してそのA1にSheet8のA1の値をコピーしてSheet9のA1に値のみを貼り付けしたら解決しました。 大変忙しいところをご迷惑を掛けながらご協力をいただいたことに心から感謝します。 本当に有難うございました。 今後ともよろしくご指導重ねて宜しく御願いします。
補足
最初のブックの構成は次のようにしていました。 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) この時に入れていたマクロはC10に件名を入力すると発行年月日が表示されるものです。 ここまでは順調に作動していました。 その上にできるだけ省力化したくファイル名が自動的に入力されるマクロを見つけたのでそれを新たなシーに追加しました。 それが下記です。 Sheet8(file) この追加したマクロのみは反映されず上手く作動せず皆様方にご指導を求めています。 ご多分に漏れずあなたのアドバイスや他の人のアドバイスを受けながら試しています。 いずれも何の変化もなく作動しません。 だからどういう結果になったかという報告ができないでいます。 知識不足いや未熟な小生なりにいろいろとトライして判明したのが1つあります。 上記の作成方法を逆にしてみたら一度だけですがファイル名が ファイル(F) 名前を付けて保存 ファイル名(N) に上記のFileのA1に入力された値が適用されました。 但し2回目の保存には適用はだめでした。 ここのところをどういうマクロにすればいいかが今のアドバイスが いただきたいところです。 ご迷惑を掛けていることに誠に申し訳なく思っています。 これ以上ご回答をいただくのが困難であればあきらめます。
- imogasi
- ベストアンサー率27% (4737/17069)
1つのシートChangeイベント・プロシが2つあるのはおかしい。 やれるなら Private Sub Changeイベント IF A条件の場合(IF文 EndIF) 日付設定のコード End If ’ーーー IF B条件の場合(If文 EndIF) ファイル保存のコード End If End Sub としてAの場合とBの場合が共通条件がなければ、上記のように、一旦同じ1つのChangeプロシで受けて、処理を条件を判別して分ける方法で、コードをかけると思う。 しかし、ファイル保存をChangeイベントと関連づけるような 実際の場合はありえないのでは。一度条件などを文章で表現してよく考えてご覧。
お礼
自分で何とか試行錯誤の上、解決策を見いだしました。 スマートでない方法かも知りませんがご報告します。 従来のブック内容が、 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file)※ここのA1に「付けたいファイル名」をまとめました。 で自動保存のマクロを挿入したSheet9、 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 を追加してそのA1にSheet8のA1の値をコピーしてSheet9のA1に値のみを貼り付けしたら解決しました。 大変忙しいところをご迷惑を掛けながらご協力をいただいたことに心から感謝します。 本当に有難うございました。 今後ともよろしくご指導重ねて宜しく御願いします。
補足
いつも御世話になり感謝しています。 難しいことが分からない小生をいつも暖かくご指導有難うございます。 折角ご指導いただいていますが私にはレベルが高すぎて消化不良です。 本当に済みません。 もっともっと努力するように頑張りますので今後ともよろしく御願いします。
- n-jun
- ベストアンサー率33% (959/2873)
n-junです。 >>#3 JUNさんえ(ごめんなさい。 ここで失礼とは思いますがお借りします)。 >>いつ保存したいのですか? >>提示したコードだとセルの値を変えるたびに保存する事になりますが、 >>そうではなく最終的に保存する時にと言う事ですか? >「提示したコードだとセルの値を変えるたびに保存する事になります」 >に変更させてください。 >最初にSheet1で保存のマクロを作成してその後に納品 請求書等を作成すればいいみたいです。 >ただし上にも書かせていただきましたが1回のみが良くて複数回がだめです。 ・Sheet1(納品請求書1)~Sheet3(納品請求書3) ・Sheet4(月請求書) ・Sheet5(顧客登録) ・Sheet6(設定) ・Sheet7(領収書) ・Sheet8(file) これらのシートのうち、 ”どのシートのセルを変更するたびに、どのシート名を変更し且つ保存作業を行ないたいのか?” と言うが不明です。 ようはセル値でそのシート名を、ころころ変える必要な項目が検討つかない。 考えられるのが”納品請求書”と言うシートが1つあり、そのシートのA1に 「納品請求書1」と入れたら”納品請求書1”と言うシートが、 「納品請求書2」と入れたら”納品請求書2”と言うシートが、 作成されそれぞれのシート名を変更する。 と言うような1つのシートイベントではなく、複数にまたがるイベントが必要なのでは? と感じましたけど、違っていたらごめんなさい。
補足
最初のブックの構成は次のようにしていました。 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) この時に入れていたマクロはC10に件名を入力すると発行年月日が表示されるものです。 ここまでは順調に作動していました。 その上にできるだけ省力化したくファイル名が自動的に入力されるマクロを見つけたのでそれを新たなシーに追加しました。 それが下記です。 Sheet8(file) この追加したマクロのみは反映されず上手く作動せず皆様方にご指導を求めています。 ご多分に漏れずあなたのアドバイスや他の人のアドバイスを受けながら試しています。 いずれも何の変化もなく作動しません。 だからどういう結果になったかという報告ができないでいます。 知識不足いや未熟な小生なりにいろいろとトライして判明したのが1つあります。 上記の作成方法を逆にしてみたら一度だけですがファイル名が ファイル(F) 名前を付けて保存 ファイル名(N) に上記のFileのA1に入力された値が適用されました。 但し2回目の保存には適用はだめでした。 ここのところをどういうマクロにすればいいかが今のアドバイスが いただきたいところです。 私なりには今一歩の所にきているような気がしますが。 ご迷惑を掛けていることに誠に申し訳なく思っています。 これ以上ご回答をいただくのが困難であればあきらめます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >Sheet名が 「File」 で指定してマクロを作動させたらいけないでしょうか。 >もしいいのならどういうマクロにすればいいですか。 そうするには、その前の前提があります。 Private Sub Worksheet_Change(ByVal Target As Range) まず、このマクロは、どこにあるかによって違います。 たぶん、Sheet8 にあるのだとすれば、ActiveSheet でよいのですが、 そうでないのかもしれません。そうでないことを前提として書きます。 これは、プロジェクトウィンドウを確認して書いたものだと思います。 Sheet6(設定) Sheet7(領収書) Sheet8(file) ←この名前が常に変わるという意味だと思います。 "file" という名称は使えませんから、 Sheet8.Name = Target.Name とします。 ただし、間違えないでほしいのは、Sheet8 というのは、Sheets("file")というようなものではないということです。Sheet6, Sheet7, Sheet8 というのは、オブジェクト名といって、特別に指定しない限りは、この部分は変わりません。
補足
この場お借りして皆さんに御願い。 #3 JUNさんえ(ごめんなさい。 ここで失礼とは思いますがお借りします)。 いつ保存したいのですか? 提示したコードだとセルの値を変えるたびに保存する事になりますが、 そうではなく最終的に保存する時にと言う事ですか? 「提示したコードだとセルの値を変えるたびに保存する事になります」 に変更させてください。 最初にSheet1で保存のマクロを作成してその後に納品 請求書等を作成すればいいみたいです。 ただし上にも書かせていただきましたが1回のみが良くて複数回がだめです。 ご面倒を承知でご協力していただけないでしょうか。 何卒宜しく御願いします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #1さんの三点のご質問は、要点をついているようです。 ブックの保存のマクロは、Worksheet_Change イベントには、ちょっと厳しいです。コマンドボタン程度にしたほうが確実です。また、日付を入れるだけのイベントは、ひとつだけなら、Workbook_Openイベントぐらいで十分のような気がします。 それと、#2のお礼の中の、 >取りあえず Private Sub ~ >をエディターにいれました。 >上手くゆきません。 よほど自分のマクロのスキルに自信があるならともかく、#2さんのコードをそのまま全部入れ替えるべきだと思います。挿入のようなことをしたら、エラーを出す部分で読み落としてしまいます。自分のコードを消したくないのなら、コメントブロック(')を、デバッグツールバーのコマンドボタンか、デバッグでつけてください。また、コードが通らない場合、ステップモードや、ブレイクポイントを置いて、途中で流れを調べて、エラーの発生ポイントを煮詰めてください。VBAの質問では、 「上手く行きません」だけというのは、良い回答ではありません。 元のコードには、単純なミスがあるようですが、質問する場合は、どこが上手く行かないか、エラーメッセージなどが出ていたら、それを出してください。変数や戻り値を調べる場合は、MsgBox でも良いと思います。 今回は、私もコードを書いてみましたが、実は、あまり自信がありません。もう少しレベルの高い問題で、二つの内容があまりにもかけ離れているので、上手くいくかどうかは、なんともいえません。別々では可能なことが、一緒にすると解決しないこともあります。 それに、ブック名が変わってしまいます。 違うセルに書き入れる場合は、イベントの発生を防ぐために、以下を入れますが、 Application.EnableEvents = False 今回は、なんとなく、これを最初の行に持ってこないほうが良いような気がします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim myPath As String If Target.Value = "" Then Exit Sub If Target.Address = "$A$1" Then ActiveSheet.Name = Target.Value myPath = ThisWorkbook.Path & "\" ThisWorkbook.SaveAs myPath & Target.Value ElseIf Target.Address = "$C$10" Then Application.EnableEvents = False Range("E4").Value = Date Application.EnableEvents = True End If End Sub
補足
1つ質問させてくだい。 ActiveSheet.Name = Target.Value でSheet名が 「File」 で指定してマクロを作動させたらいけないでしょうか。 もしいいのならどういうマクロにすればいいですか。 ご指導下さい。
- n-jun
- ベストアンサー率33% (959/2873)
#3です。 例えば閉じる時に実行するとしたら。 Workbook_BeforeClose プロシージャを使用する http://support.microsoft.com/kb/213639/ja などが参考になるかもです。 あくまでイベントの発生の参考です。 ボタンを押したらとか、他のイベントの場合は違いますので。
補足
質問の番号 作動する 作動しない No 1のみ(発行日の日付) ○ No 2のみ(ファイル名の自動保存) ○ No 1+2(発行日の日付+ファイル名の自動保存)1は○ 2はX 2は新たにエクセルを起ち上げシート1 A1 (仮にABCを)に値を入れるとすぐに シート名がSheet1名とファイル名がABC になり変わります。 1と2にするとなりません。
- n-jun
- ベストアンサー率33% (959/2873)
#1です。 >保存するときに ファイル/名前を付けて保存(F)/ファイル名(N) (にA1の値が表示)/保存ボタン クリック >で保存ができるように。 と >Private Sub Worksheet_Change(ByVal Target As Range) ってかみ合ってないような感じですけど。 いつ保存したいのですか? 提示したコードだとセルの値を変えるたびに保存する事になりますが、 そうではなく最終的に保存する時にと言う事ですか?
補足
保存は一回だけです。 おっしゃる最終的です。
- xls88
- ベストアンサー率56% (669/1189)
どういう結果が得たいのか、イマイチ理解できません。 どうされたいのですか? 取りあえず Private Sub Worksheet_Change(ByVal Target As Range) 'If Target.Row = 1 And Target.Column = 1 Then If Target.Address = "$A$1" Then Range("E4").Value = Date ActiveSheet.Name = Target.Value ThisWorkbook.SaveAs ThisWorkbook.Path & "\" & Target.Value End If If Target.Address = "$C$10" Then 'Target.Offset(-6, 2).Value = Date Range("E4").Value = Date End If End Sub
お礼
自分で何とか試行錯誤の上、解決策を見いだしました。 スマートでない方法かも知りませんがご報告します。 従来のブック内容が、 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file)※ここのA1に「付けたいファイル名」をまとめました。 で自動保存のマクロを挿入したSheet9、 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 を追加してそのA1にSheet8のA1の値をコピーしてSheet9のA1に値のみを貼り付けしたら解決しました。 大変忙しいところをご迷惑を掛けながらご協力をいただいたことに心から感謝します。 本当に有難うございました。 今後ともよろしくご指導重ねて宜しく御願いします。
補足
取りあえず Private Sub Worksheet_Change(ByVal Target As Range) 'If Target.Row = 1 And Target.Column = 1 Then If Target.Address = "$A$1" Then Range("E4").Value = Date ActiveSheet.Name = Target.Value をエディターにいれました。 上手くゆきません。 私は Sheet8(file) を新たにシートを追加してA1にファイル名したいものを表示させて見たのですが。 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file) の何処にマクロを挿入するのかがあるのですか。 私はSheet8(file)に下のですがここの場所がいけないのでしょうか。 よく分かりませんがマクロの中でシート名を指定しなければなりませんか。 恐れ入りますが知識不足の小生をご指導宜しく御願いします。 ご質問に答えていますか。 ごめんなさい。
- n-jun
- ベストアンサー率33% (959/2873)
うまくいかないとはどういう事なのでしょう? ・この様にしたいけど、実際はこの様になってしまう。 ・この様なはずではないが、こうなってしまう。 ・シートが複数あって、1と2が同じシートイベントで良いのか、違うのか。 等具体的にされた方がいいかもですよ。
補足
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 でマクロを追加して A1の値をそのまま ファイル名 として保存をしたいのです。 保存するときに ファイル/名前を付けて保存(F)/ファイル名(N) (にA1の値が表示)/保存ボタン クリック で保存ができるように。
お礼
自分で何とか試行錯誤の上、解決策を見いだしました。 スマートでない方法かも知りませんがご報告します。 従来のブック内容が、 Sheet1(納品請求書1)~Sheet3(納品請求書3) Sheet4(月請求書) Sheet5(顧客登録) Sheet6(設定) Sheet7(領収書) Sheet8(file)※ここのA1に「付けたいファイル名」をまとめました。 で自動保存のマクロを挿入したSheet9、 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 を追加してそのA1にSheet8のA1の値をコピーしてSheet9のA1に値のみを貼り付けしたら解決しました。 大変忙しいところをご迷惑を掛けながらご協力をいただいたことに心から感謝します。 本当に有難うございました。 今後ともよろしくご指導重ねて宜しく御願いします。
補足
おっしゃるように元々作成しているブックに新たに自動保存するシートを追加するとだめです。 ここで言う追加部分を先にして元々のファイルを追加してゆくと1回だけはA1 (仮にABCを)に値を入れるとすぐに シート名がSheet1名とファイル名がABC になり変わります。 2回目からは何の反応もなくだめです。 このブックは元本として残し使います。 テストはコピーを作成しています。 言葉としての説明は難しいですね。 本当にご協力いただき有難うございます。 いつ保存したいのですか? 提示したコードだとセルの値を変えるたびに保存する事になりますが、 そうではなく最終的に保存する時にと言う事ですか? Sheet1(納品請求書)からは注文の数だけSheet(納品請求書)数は増えますが保存はSheet1の納品請求書に必要な事項を入力したときにブックとして「名前を付けて保存」します。 これはブックで色んなシートがふくまれています。 1つの会社で毎月このブックを作成しています。 因みに OSはXP エクセル2003です