• ベストアンサー

エクセルVBAで SendKeys "{TAB}"

エクセル2000です。 一つのブックに何枚かシートがあります。 各シートは保護されており、いくつかロックされていないセルがあります。 各シートの最初のロックされていないセル(シートにより異なります)にカーソルを飛ばしたいのですが、下記のようにやってもセルA1が選択されたままで飛んでくれません。 どこが悪いのでしょうか? Sub TEST() Dim sh As Worksheet For Each sh In Worksheets sh.Activate sh.Cells(1, 1).Activate SendKeys "{TAB}" MsgBox ActiveCell.Address Next End Sub なお、 sh.EnableSelection = xlUnlockedCells を挿入すればSendKeys "{TAB}"がなくとも、カーソルが飛びますが、今回はEnableSelection = xlUnlockedCellsしたくないのです。 よろしくおねがいします。

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

  • ベストアンサー
  • bonaron
  • ベストアンサー率64% (482/745)
回答No.1

SendKeys "{TAB}", True としてみては?

merlionXX
質問者

お礼

bonaronさま 試してみたところばっちりです! ありがとうございました。

merlionXX
質問者

補足

SendKeys "{TAB}", True のTrueはどういう意味なのでしょうか?

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.3

こんにちは。KenKen_SP です。 SendKeys はアクティブウインドウに送られます。つまり、  ・SendKeys 実行時に目的のウインドウがアクティブになっていなければ   ならない  --->ここでいうアクティブウインドウとは、Excel アプリケーション内    の Active ではなく、OS レベルで入力可能状態にあるウインドウ    を指します。 と言えます。したがって、VBE の画面からコードを実行した場合、VBE に対し て SendKeys が送信されてしまうのですから、失敗しますね... そこで、SendKeys を実行する直前に少なくとも目的のウインドウをアクティ ブにするコードを入れてやります。それから、ループで回すなら、#1 ご回答 にありますように第2引数を True にする必要があります。 とは言え、SendKeys は 100% の動作保証が得られないため、Wendy02 さん ご回答のように他ロジックで対応できるなら、使わない方が良いとは思います。 Sub TEST()   Dim sh As Worksheet   AppActivate (Application.Caption) ' ※ ココもポイント   For Each sh In Worksheets     sh.Activate     sh.Cells(1, 1).Activate     SendKeys "{TAB}", True    ' ※ #1 ご回答のポイント   Next End Sub

merlionXX
質問者

お礼

KenKen_SPさま、ありがとうございます。 >・SendKeys 実行時に目的のウインドウがアクティブになっていなければ   ならない 今回のはアクティブになっていましたが勉強になりました。 > 第2引数を True にする必要があります。 調べました。 (既定値) False/プロシージャの終了を待たずに次の行に制御を移します。 True/処理が終了するまで実行を一時中断します。 ということだったんですね。 ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 上位バージョンですと、また違う方法もありますが、Excel2000 ですと、こんな方法があるのかなって思います。ただし、シートをぐるぐる回すのは、ちょっと取りやめました。 もしするなら、最初に、モジュールレベルで、変数をプロシージャの外に出して、シートごとの配列変数に、UnLocked Cells のAddressを溜めておくほうが便利かもしれません。 Sub FindUnLockedCells()  Dim arAddress() As String  Dim sh As Object 'As Worksheet  Dim c As Range  Dim i As Long  Dim j As Long    Set sh = ActiveSheet    For Each c In sh.UsedRange.Cells   If c.Locked = False Then    ReDim Preserve arAddress(i)    arAddress(i) = c.Address    i = i + 1   End If  Next c  '選択実行  For j = LBound(arAddress) To UBound(arAddress)   sh.Range(arAddress(j)).Activate   MsgBox arAddress(j)  Next j End Sub

merlionXX
質問者

お礼

Wendy02さま、おはようございます。 これはロックされてないセルのAddress変数に入れて、それを選択しているのですね。 勉強になりました。

関連するQ&A