none
Excel VBA ですが VBAProjectで変な状況になっています。 RRS feed

  • 質問

  • 新規のBook開いてそのWorksheetモジュールにVBのコードを貼り付ける。

    Option Explicit
    Sub CodeCopytest()
    Dim i As Long, codex As String
    Workbooks.Add
    With ThisWorkbook.VBProject.VBComponents("モジュールCPY").CodeModule
    codex = .Lines(1, .CountOfLines)
    End With
    With ActiveWorkbook.VBProject.VBComponents(Worksheets("Sheet1").CodeName)
    .CodeModule.AddFromString codex
    End With
    End Sub
    このコードを実行すると新規のBookのシートモジュールに「モジュールCPY」に書いたコードが貼り付けられます。
    「モジュールCPY」(内容は関係ないと思いますが掲載します)
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column < 8 And Target.Column Mod 2 = 1 Then
    Target.Offset(0, 1) = Target.Value + 1
    End If
    End Sub


    処理はうまくいくのですが、この処理の後カーソルがWorksheetに戻って来ません。
    つまり何かを入力してもActiveなセルには変化なく、VBEのWorksheetモジュールの編集画面に入力されてしまうのです。
    バグだとは思いますが、何か回避の方法は無いでしょうか。
    ちなみにこのコードのBookを開いてから一度でもVBEを開くとこの現象は起きません。
    つまりこのコードのあるBookを保存してから開いて「Alt+F8]から実行するとこの現象が起きます。
    どこかのセルをクリックすればWorksheetのカーソルが有効になります。(VBEから抜ける)

    ちなみにExcel2007で同じ事をするとNumLockが消えてしまいます(^^;
    • 移動 山本春海 2012年7月31日 8:16 より適切と思われるカテゴリに移動しました。 (移動元:Visual Basic)
    2012年7月24日 5:30

回答

  • いろいろお騒がせしました。バグかもしれないが何らかの回避方法がないかと試したのですが。
    別のBookのシートモジュールにWorksheet_Changeイベントを仕込みたかったのですが諦めました。
    Application.OnkeyでEnterと矢印をフックして処理することにしました。

    回答、助言 ありがとうございました。

    • 回答としてマーク 山本春海 2012年8月2日 9:04
    2012年7月27日 8:05

すべての返信

  • 試したところExcel2007で問題なく動いたので、以下が原因かどうかは解りません。

    Workbooks.Add のあとに他の処理を挟んで
    追加されたWorkbookとしてActiveWorkbookを呼んでるようですが、これは良くありません。
    ActiveWorkbookは内部の処理や外的要因により変化する恐れがあります。

    Workbooks.Add()にはWorkbookの戻り値があるので、それを使うのが確実です。
    • 編集済み hihijiji 2012年7月24日 7:22
    2012年7月24日 7:19
  • 実際は別のBookを開いても同じことが起きます。

    Workbook.addも変更してみましたが結果は同じです。

    Excel2003でおきました。

    そのファイル(Xls)を2007で実行したらNumLoclが消えました。

    これは機種の問題もあるかもしれないので今日たのPCで試します。

    2012年7月24日 8:00
  • リボイスさん、おはようございます。

    ポイントは、現在どのブックのどのシートがアクティブになっているかを把握しながら、マクロを作ると分かり易いと思います。複写をすると、複写先がアクティブなブックとシートとなります。カーソルもここに移動しています。

    Option Explicit
    Sub CodeCopytest()
    Dim codex As String
    'Book1のSheet1コードモジュールを新規ブックのSheet1に複写します。
    '複写元のブックのシート(最初アクティブなブック)
    With Workbooks("Book1.xlsm").VBProject.VBComponents("Sheet1").CodeModule
        codex = .Lines(1, .CountOfLines)
    End With
    '新規作成する複写先のブックのシート(こちらがアクティブなブックとなる)
    Workbooks.Add
    With ActiveWorkbook.VBProject.VBComponents(Worksheets("Sheet1").CodeName)
        .CodeModule.AddFromString codex
    End With
    '複写元のブックに制御を戻す。(最初のアクティブなブックへ戻す)
    Workbooks("Book1.xlsm").Activate
    End Sub

    最後の行のWorkbooks(”xxxxx”).Activateで、カーソルが欲しい、ブックへ移動できます。

    Book1のモジュールをBook2にコピーする
    http://officetanaka.net/excel/vba/vbe/07.htm

    追伸
    フォーラムホームの最後、『Visual Basic for Application(VBA)VBA』のご質問等はこちらです~。

    2012年7月24日 23:06
  • 回答ありがとうございます。
    実はそれも試しました。
    実際にカーソルが欲しいのはCopyされたBookなのですが、この現象が起きたので元のBookをActiveにして、またCopyされたBookに戻したり。そこでセルに値を入れて、消したり、シートを追加して値を入れて消したり。考えつくことは全てやりました。
    そのコードの最後でSendkeyをしてみるとやはりVBEに送られていましたし現象はなおりませんでした。

    2012年7月25日 0:47
  • Fuda1です。

    そうですか?、リボイスさんは、Excel VBAのプログラムに原因があると思われているようですが、私は別の原因があるのではと思えて来ました。リボイスさんがテストしているプログラムをもう一度、綺麗に清書してアップして頂けると結論がでると思います。取り合えず、そのパソコンのExcelの再インストールを実施されては如何でしょうか?

    2012年7月25日 1:15
  • いろいろお騒がせしました。バグかもしれないが何らかの回避方法がないかと試したのですが。
    別のBookのシートモジュールにWorksheet_Changeイベントを仕込みたかったのですが諦めました。
    Application.OnkeyでEnterと矢印をフックして処理することにしました。

    回答、助言 ありがとうございました。

    • 回答としてマーク 山本春海 2012年8月2日 9:04
    2012年7月27日 8:05