Excel2013のVBAを使って自動更新をしようと思っています。
A B C
1 あ AA 0
2 い AB 1
3 う AC 0
4 え AA 1
5 お AA 0
上記のようにシート内にデータはあります。B列「AA」C列の「ゼロ」を更新してC列の値を「1」にしようとしたときに、ピボットテーブルを使ってみようと思いました。
ピボットテーブルにてB列の「AA」、C列の「ゼロ」を抽出表示しました。
A B C
1 あ AA 0
5 お AA 0
思っていたように1行目と5行目が抽出されました。
後はゼロを別の値(仮に「2」とします)に変更するときに、カーソルの移動がうまくいきませんでした。
Range("C1").End(xlDown).Select
Do
ActiveCell.Offset(0, 0) = "2"
ActiveCell.Offset(-1, 0).Select
If Len(ActiveCell.Offset(0, 0)) = 0 Then
Exit Do
End If
Loop
しかし、これではカーソルが「C4」に移動してしまいました。
ピボットテーブルでたたんでしまっても、カーソルは見えないセルに移動するようです。
そこで、下記のように変更しました。
Range("C1").End(xlDown).Select
Do
ActiveCell.Offset(0, 0) = "2"
Application.SendKeys "{UP}"
If Len(ActiveCell.Offset(0, 0)) = 0 Then
Exit Do
End If
Loop
これは、カーソルがまったく動かずに最初の地点にいたままでした。
そこで、次はTABで移動することにしました。
Range("C1").Select
Selection.SpecialCells(xlCellTypeVisible).Select
Do
ActiveCell.Offset(0, 0) = "2"
Application.SendKeys "{tab}"
If Len(ActiveCell.Offset(0, 0)) = 0 Then
Exit Do
End If
Loop
これでもカーソルは動きませんでした。
どうにかしてsendkeysの動かし方、もしくは更新でもっとうまいやり方をご存知の方、是非教えてください。よろしくお願いいたします。
Row.hidden で「行が非表示か」をチェックできます。
Do 'ひとつ上の非表示ではないセルを選択
ActiveCell.offset(-1,0).select
Loop While ActiveCell.EntireRow.Hidden
あるいは、SendKeysを使う場合「ボタンから実行」します。
VBAエディタ上でF5実行とかすると、エディタに対してキーを投げちゃうので、コードにTABが増えてると思いますよ。
お礼
ap_2さん、コメントありがとうございます。 hiddenは「見せないための関数」と思いきや、「見えない部分の関数」だったのですね。とても驚いています。 頂いた内容をマクロに反映させて無事に作成できました。ありがとうございました。 追伸 sendkeysを実行すると確かにエディタの中が大変なことになりました。何故そこだけエディタに投げてしまうのか??? 不思議だったのですが、すっきりしました。合わせて感謝!!!