- ベストアンサー
VBA SendKeysステートメントについて
- VBA SendKeysステートメントを使用して、列の空白セルまでデータを修正する方法について知りたいです。
- SendKeysステートメントを使用して、VBAで入力されたデータを修正する方法について調べましたが、単一セルの修正しかできませんでした。列の空白セルまでデータを修正する方法があれば教えてください。
- VBA SendKeysステートメントを使用して、特定の列の空白セルまで入力されたデータを修正する方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
これは単一セルだからたまたま実現できたに過ぎません。 範囲内でSendKeys "{F2}"を実行しても入力完了を待ち合わせる事は出来ませんので 各セルに再編集さえできません。 一例ですが、セル選択したら編集モードに変更する事ような事は可能なのでイベント プロシージャを利用して以下の方法は如何でしょうか。 (1)シートモジュールにしたいのでシートタグ名上で右クリック→コードの表示→以下の コードを貼り付けてお試しください。 ■サンプルコード セル選択でA列範囲、且つセル未入力以外なら該当セルを編集モードに切り替えます。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Intersect(Target, Range("A:A")) Is Nothing _ Or Target = "" Then Exit Sub SendKeys "{F2}" End Sub
その他の回答 (3)
- mu2011
- ベストアンサー率38% (1910/4994)
NO3です。 >他のブックの列に利用できるかどうか ⇒個人マクロブックの様な使用は出来無いと思います。
お礼
そうですか・・ご返信いただきまして嬉しかったです。ありがとうございました。
- imogasi
- ベストアンサー率27% (4737/17069)
今まで色んなVBAの記事を見ていると、SendKeysは他に方法が無いときに使う手段のようです。 初心者が使うのは適当でないと思う。 (1)1文字だけ置換、決った文字列(数種)だけ置換など、ルール性があるならプログラムで置換を使う などの方法を考えることでしょう。 ーー その列のデータ最終行を掴むコードなど、毎日回答にも使われているし、WEBで照会すれば直ぐ出てくる。 こういう方法を勉強しないとVBAなど出来ませんよ。 Googleででも「エクセル データ最終行」 http://www.happy2-island.com/excelsmile/smile03/capter00702.shtml など ーー SendKeys "{F2}" の件は私が色々やったがうまく行かない(私の力不足だけかもしれないが) 数式バー部に出たデータの任意の位置に(先頭でも)クリックを入れると同等のような動作がVBAでは判らない。 APIとかを使わないとならないのかな。 (よく質問にあるが)初心者の思いつき方法で、解決方法を難しくしてしまっている例かなと思う。 ーー 私が連想した例 セルの値に r が在ればss に変える例。 Sub test02() d = Worksheets("Sheet1").Range("A65536").End(xlUp).Row '最終行取得 MsgBox d For i = 2 To d x = Worksheets("Sheet1").Cells(i, "A") p = InStr(x, "r") If p <> 0 Then Worksheets("Sheet1").Cells(i, "A").Characters(p, 1).Text = "ss" End If Next i End Sub 列データを範囲指定して、For Eachを使う手もある。(自分で操作する場合用か) 他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。
お礼
>他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。 たしかにおっしゃるとおりだと思います。予測できない動作をしないようにこれからも勉強したいと思います。 お忙しい中サンプルコードまで提示していただいて本当にありがとうございました。
- MARU4812
- ベストアンサー率43% (196/452)
キーボードの[F2]押下ってセルを入力状態にするだけでは? セルの値を編集するなら、 Sub Macro1() Dim xlsSheet As Excel.Worksheet Dim xlsRange As Excel.Range Dim strTmp As Excel.Range Set xlsSheet = Worksheets(1) Set xlsRange = xlsSheet.Range("A2") MsgBox xlsRange.Value xlsRange.Value = xlsRange.Value & "Test" End Sub とかでいいのでは? # SendKeys も Activate もかなり有名な欠点があるけど # 知った上で使っているんでしょうか。 Sub Macro1() Dim xlsSheet As Excel.Worksheet Dim xlsRange As Excel.Range Dim xlsTargetRange As Excel.Range Dim strTmp As Excel.Range Dim intColCount As Integer Dim intColIndex As Integer Set xlsSheet = Worksheets(1) Set xlsRange = xlsSheet.Range("A2") intColCount = xlsRange.End(xlToRight).Column - xlsRange.Column + 1 MsgBox xlsRange.End(xlToRight).Address & "まで" & intColCount & "列使ってます。" For intColIndex = 0 To intColCount - 1 Set xlsTargetRange = xlsRange.Offset(0, intColIndex) xlsTargetRange.Value = xlsTargetRange.Value & "Test" Next End Sub End(xlToRight)を使わなくても、セルを1つずつずらしていって Value で ""(空白)条件に合ったら Exit For するのでもできますよね。
お礼
→# SendKeys も Activate もかなり有名な欠点があるけど # 知った上で使っているんでしょうか。 その有名な欠点を検索して探してみます。 サンプルコードなどの組み方非常に勉強になりました、お忙しい中提示していただいてありがとうございます。
お礼
お忙しい中本当にご回答の程ありがとうございました。サンプルコードまで提示していただいて期日がせまっている私には嬉しかったです。 ありがとうございます。
補足
お忙しい中ご回答ありがとうございます。 サンプルコードを使用させていただいたところ、考えていた通りの動きをしてくれました! 本当に凄いです! 補足してもうしわけありませんが、上記のコードをブック(A)から呼び出したブック(B)(つまり他のブックの列に利用できるかどうか)何ですが可能でしょうか? 追加補足で申し訳ありませんがご回答いただければ幸いです。