- ベストアンサー
エクセル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したくないのです。 よろしくおねがいします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
SendKeys "{TAB}", True としてみては?
その他の回答 (2)
- KenKen_SP
- ベストアンサー率62% (785/1258)
こんにちは。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
お礼
KenKen_SPさま、ありがとうございます。 >・SendKeys 実行時に目的のウインドウがアクティブになっていなければ ならない 今回のはアクティブになっていましたが勉強になりました。 > 第2引数を True にする必要があります。 調べました。 (既定値) False/プロシージャの終了を待たずに次の行に制御を移します。 True/処理が終了するまで実行を一時中断します。 ということだったんですね。 ありがとうございます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 上位バージョンですと、また違う方法もありますが、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
お礼
Wendy02さま、おはようございます。 これはロックされてないセルのAddress変数に入れて、それを選択しているのですね。 勉強になりました。
お礼
bonaronさま 試してみたところばっちりです! ありがとうございました。
補足
SendKeys "{TAB}", True のTrueはどういう意味なのでしょうか?