アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル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したくないのです。
よろしくおねがいします。

A 回答 (3件)

SendKeys "{TAB}", True


としてみては?

この回答への補足

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

補足日時:2006/09/26 09:16
    • good
    • 2
この回答へのお礼

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

お礼日時:2006/09/26 09:15

こんにちは。

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
    • good
    • 0
この回答へのお礼

KenKen_SPさま、ありがとうございます。

>・SendKeys 実行時に目的のウインドウがアクティブになっていなければ
  ならない

今回のはアクティブになっていましたが勉強になりました。

> 第2引数を True にする必要があります。

調べました。
(既定値) False/プロシージャの終了を待たずに次の行に制御を移します。
True/処理が終了するまで実行を一時中断します。
ということだったんですね。
ありがとうございます。

お礼日時:2006/09/26 10:29

こんばんは。



上位バージョンですと、また違う方法もありますが、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
    • good
    • 0
この回答へのお礼

Wendy02さま、おはようございます。

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

お礼日時:2006/09/26 09:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています