- ベストアンサー
VBAで困ってます。新たな問題が発生しました。
- No.2014068で質問したVBAに関する新たな問題が発生しました。ファイル内でEnterを押すとエラーメッセージが表示され、VBA入りのファイルを閉じているにもかかわらず、VBAの入っていないファイルを開いた際にも関連ファイルが呼び出されてしまいます。具体的な原因はわかりませんが、VBA(3)が影響している可能性があります。
- この問題により、Excelファイルの利用に制限が生じており、VBA(3)機能が必要な時にも使用できません。解決策が見つかると助かります。
- 他のテストでは、VBA(1)と(2)の機能だけでは問題が発生せず、他のファイルを開いても影響しませんでした。したがって、VBA(3)が原因と考えられます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。Wendy02です。 たいへんすみませんでした。手を抜いたわけではなかったのですが、マクロをある程度、ご存知の方とそうでない方があって、教えても、「ThisWorkbook モジュールは何」と聞かれて説明するのも気が進まないもので、あのような形にしてしまいました。 きちんとした形に、変えさせていただきます。 一応、こちらでも調べてみましたが、もう一度調べてみてください。 ThisWorkbook モジュールに設定して試してみてください。 '----------------------------------------- Private Sub Workbook_Activate() 'ブックをアクティブにした時 Call SettingMacro End Sub Private Sub Workbook_Open() 'ブックをオープンした時 Call SettingMacro End Sub Private Sub Workbook_BeforeClose(Cancel As Boolean) 'ブックをクローズした時 Call SettingOffMacro End Sub Private Sub Workbook_Deactivate() 'ブックを非アクティブにした時 Call SettingOffMacro End Sub Private Sub Workbook_SheetActivate(ByVal Sh As Object) 'シートをアクティブにした時 If Sh.Name = "Sheet1" Then Call SettingMacro End If End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 'シートをアクティブにした時 If Sh.Name = "Sheet1" Then Call SettingOffMacro End If End Sub '--------------------------- Private Sub SettingMacro() '設定 Application.OnKey "{Enter}", "ThisWorkbook.JumpingMacro" Application.OnKey "~", "ThisWorkbook.JumpingMacro" End Sub Private Sub SettingOffMacro() '解除 Application.OnKey "{Enter}" Application.OnKey "~" End Sub '--------------------------- Private Sub JumpingMacro() If ActiveSheet.Name = "Sheet1" Then If Not Intersect(ActiveCell, Range("$B$2")) Is Nothing Then Cells(65536, 1).End(xlUp).Offset(1).Select ElseIf Not Intersect(ActiveCell, Range("A5:H65536")) Is Nothing And _ ActiveCell.Column = 8 Then Cells(ActiveCell.Row, 1).Select Else ActiveCell.Offset(, 1).Select End If Else ActiveCell.Offset(1).Select End If End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
situmon10hanakoさん、こんばんは。 Wendy02です。 >もし、シート名を変更した場合はその都度VBAのシート名も変えないと構文の効き目がないのですね。 すみません、シート名を変更しても、シート名を変えずに出来ます。これは、また、少し上の段階になります。簡単に換えればよいことですが、それでも、慣れていないと間違えやすいです。 Private Sub Workbook_SheetActivate(ByVal Sh As Object) 'シートをアクティブにした時 If Sh.CodeName = "Sheet1" Then Call SettingMacro End If End Sub Private Sub Workbook_SheetDeactivate(ByVal Sh As Object) 'シートをアクティブにした時 If Sh.CodeName = "Sheet1" Then Call SettingOffMacro End If End Sub '*** Private Sub JumpingMacro() If ActiveSheet.CodeName = "Sheet1" Then ・ ・ ・ この『CodeName』 というのは、左下のプロパティ・ウィンドウに出てくるオブジェクト名のことです。これは、一般的に、手動でしか変更しないものですから、ほとんど固有ですから、これで固定できます。 >VBAを含めパソコンのなかをよく知っている人は魔法使いと似ています。 >たくさんの呪文を学んで身につけ、呪文ひとつで何でもやってしまうような感じです。 プログラミングは、ひじょうに語学に似ています。 私は、それほど語学が出来ませんので、毎日、VBAやVisual Basic は勉強を続けています。たかがExcelなのに、ただ、それだけでは、足らないようです。単語と構文の組み合せです。基礎的な組み合せによって構文を作ります。主語がオブジェクト、動詞がメソッド、目的語はそれぞれのプロパティのようなものです。そして、ExcelはExcelだけの固有の環境があります。 でも、私は、語学が、VBAのレベルと同じように、できるようにならないかなって、いつも思っています。
お礼
Wendy02さん、こんにちは。 NameをCodeNameにしたらシート名を変更しても、なるほど、同じように動作確認しました。 ほおぉぉ~、と自分の手柄でもないのにしたり顔。 構文で使う名前を、あまり変更しない箇所で設定すれば、表面をコロコロ変えても平気というわけですね。 Nameはあだ名というか仮の呼び名で、CodeNameは本名みたいなもの??などとこじつけてわかろうとしてみました。 私のように説明がうまくないと、質問文を書く段階で要点がまとまらず、次第に言いたいことから遠くなってヤメタ!ヤメタ!になりますが、なんとかここまでたどりつけて安心しました。 自分の能力の無さに嫌悪しながら、エイッ!と質問するボタンをクリックしますが、その先は回答者側の忍耐力に頼っているのです。すみません…。 今回もいろいろありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。Wendy02です。 >実は、貼り付け先がsheet1とThisWorkbook モジュールではどう違うのかわかりません。 >VBAことはぜんぜんわかっていません。 私も、「実は」なのですが、またまた、ひっくり返すような書き方になるのですが、年間に、500個以上は、マクロを書いているのに、ThisWorkbook にこのような書き方をしたのは、最近で、今度で二度目なのです。(^^ゞ 私の本来の書き方ではないのですが、どうも、最近、あれこれ細かい指示書を書くのが面倒になって、挙句のはてに、この書き方は、全部、コケています。こういうカテゴリですと、人がどの程度使えるのか、さっぱり分らないのです。設定もままならないという人もあれば、最初から複雑な設定を完璧に出来る人まで、様々です。 * 私の個人的な感覚ですが、ThisWorkbook モジュールというのは、そのブックのマクロの玄関のようなものだと思っています。 Bookの開け閉めの時には、必ず、そこを通っていきます。ThisWorkbookモジュールで、全部こなせるのですが、みんなで共有というわけには行きません。本来、あまり玄関先で、あれこれと指示するようなのは、ちょっとヘンなんですね。 Sheetモジュールというのは、それぞれの部屋の住人だけの司令室のようなものです。一応、別の部屋には声を掛けられるのですが、呼び出すときに、どこどこの部屋の何々さんと呼ばないと、指示できません。どちらかというと、イベントドリブン型マクロ(ボタンをクリックしたりする)など、特殊な設定にしか用いません。 標準モジュールというのは、リビングルームというか、みんなの寄り合い場所のようなもので、ある部屋を開けておけば、その部屋の人にそのまま指示できます。でも、そのモジュールは誰のものでもありません。そのままにしておけば、それはみんなで使えます。 標準モジュールとThisWorkbookとの違いは、ThisWorkbookのものは、共有物でないという点が違うわけです。Sheetモジュールをまとめ合わせたものだと思っても構いません。言い方を変えると、ThisWorkbookもSheetモジュールも物理的な実体を持っているモジュールには違いないのです。 なお、こういうことは、なんとなく、感覚的に覚えていくわけで、基本的には、なるべく標準モジュールに登録するというのが本来のマクロなんですね。
お礼
Wendy02さん、こんばんは。 会社のExcelに貼り付け、他に影響せずに動作確認ができました。 ありがとうございました。 (もし、シート名を変更した場合はその都度VBAのシート名も変えないと構文の効き目がないのですね。 VBAに慣れた人だと当然のことなのかな…。 ぜんぜんわからない私レベルでは「こういうものなんだ~」ともう探検する感覚です。) 以下は読み飛ばしていただいて結構です… Wendy02さんが夜なべしてやさしい言葉で説明してくださったのに、「ああ、そういうことね」となりませんでした。申し訳ないです。 VBAを含めパソコンのなかをよく知っている人は魔法使いと似ています。 たくさんの呪文を学んで身につけ、呪文ひとつで何でもやってしまうような感じです。 一文字違えば効き目はないし、ひどいときは他に影響が出るというのに、私のような素人は呪文の効果にしか目がいきません。 「呪文をかければこの通り!」というのは、いい所も悪い所も知っていて、うまくなければ元に戻したり回避する呪文まで知っている真の魔法使いでないとダメなんですね。 この1,2週間で泡吹いてそんなことを感じました。
- yodakii
- ベストアンサー率18% (14/74)
すみませんが No.2014068 だと、以前の問題が探せないのですが? ○月△日何時何分に質問したのか教えていただけませんか?
補足
早速のご回答ありがとうございます。 説明が足りませんでした。 質問:ExcelでEnterを押したあとの移動先について 06-03-07 23:03 に質問しました。 Office系ソフトのNo.81あたりに位置しています。 よろしくお願いします。
補足
Wendy02さん!あ~~またお会いできてよかった。 いまsheet1のコードでなくThisWorkbook モジュールに貼り付けて確認しました。 バックで他のファイルを開いても大丈夫でした。 確認したのは自宅のExcelなので、明日、実際に使う会社のExcelでやってみます。 いま締め切ってまた勇み足になりたくないので、取り急ぎ、いまは回答を見たというご報告まで、です。 (実は、貼り付け先がsheet1とThisWorkbook モジュールではどう違うのかわかりません。 VBAことはぜんぜんわかっていません。 わかりませんが、ここで手を煩わせるとWendy02さんの回答を待つ多くの方々への回答が遅れますので、気になさらないでください。)