VBA SendKeysステートメントについて

このQ&Aのポイント
  • VBA SendKeysステートメントを使用して、列の空白セルまでデータを修正する方法について知りたいです。
  • SendKeysステートメントを使用して、VBAで入力されたデータを修正する方法について調べましたが、単一セルの修正しかできませんでした。列の空白セルまでデータを修正する方法があれば教えてください。
  • VBA SendKeysステートメントを使用して、特定の列の空白セルまで入力されたデータを修正する方法を教えてください。
回答を見る
  • ベストアンサー

VBA SendKeysステートメントについて

お忙しいところ大変申し訳ありません、ご回答の程お願い申し上げます。 入力されるデータと列の数は毎回異なり入力された文字自体を修正するVBAを組みたいのですが、検索などで調べた結果「SendKeysステートメント」のコマンド「 SendKeys "{F2}"」というものを発見しました。 それで構文を組んでみたのですが、 Sub Macro1() Worksheets(1).Activate Range("A2").Activate SendKeys "{F2}" End sub で単一セルを修正する事はできました。 これを「列(列は毎回固定です)の空白セルまで」というプログラムは組めるのでしょうか? お忙しい中申し訳ありませんがご回答いただければ幸いです。

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

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.3

これは単一セルだからたまたま実現できたに過ぎません。 範囲内で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

na8888no
質問者

お礼

お忙しい中本当にご回答の程ありがとうございました。サンプルコードまで提示していただいて期日がせまっている私には嬉しかったです。 ありがとうございます。

na8888no
質問者

補足

お忙しい中ご回答ありがとうございます。  サンプルコードを使用させていただいたところ、考えていた通りの動きをしてくれました! 本当に凄いです! 補足してもうしわけありませんが、上記のコードをブック(A)から呼び出したブック(B)(つまり他のブックの列に利用できるかどうか)何ですが可能でしょうか? 追加補足で申し訳ありませんがご回答いただければ幸いです。

その他の回答 (3)

  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.4

NO3です。 >他のブックの列に利用できるかどうか  ⇒個人マクロブックの様な使用は出来無いと思います。  

na8888no
質問者

お礼

そうですか・・ご返信いただきまして嬉しかったです。ありがとうございました。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

今まで色んな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を使う手もある。(自分で操作する場合用か) 他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。

na8888no
質問者

お礼

>他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。 たしかにおっしゃるとおりだと思います。予測できない動作をしないようにこれからも勉強したいと思います。 お忙しい中サンプルコードまで提示していただいて本当にありがとうございました。

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

キーボードの[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 するのでもできますよね。

na8888no
質問者

お礼

→# SendKeys も Activate もかなり有名な欠点があるけど  # 知った上で使っているんでしょうか。 その有名な欠点を検索して探してみます。 サンプルコードなどの組み方非常に勉強になりました、お忙しい中提示していただいてありがとうございます。

関連するQ&A

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

  • EXCEL VBA Sendkeys {TAB}

    済みません、EXCELのマクロで自動でタブ移動が出来なく困っています。 いろいろ参考にして作ってみましたが、Sendkeysがセルに対して動作していないようです。 ご教授をお願いします。 Private Sub Tab_Count_Click() Worksheets("音楽リスト").Activate Range("A4:AF8").Select For i = 1 To 3 SendKeys "{TAB}", True MsgBox "OK" Next End Sub

  • VBA Setステートメント

    エクセル2002使用です。 B列に本日の日付が入るようにワークシートに関数(DAY関数)が入っています。 そのB列を検索して、同じ日付け(数字)がなければ、今日の日付を入力するVBAを組もうと思っているのですが、 Setステートメントで実行時エラー13になります。 ご教示いただけませんでしょうか? Private Sub CommandButton1_Click() ' 出勤ボタン B列に同日日付があればキャンセル Dim tuki, Hiduke1 As String Dim Hiduke1kekka As Variant tuki = Range("B3").Value Hiduke1 = Range("D3").Value Worksheets(tuki & "月").Activate Set Hiduke1kekka = ActiveSheet.Columns("B:B") _ .Find(What:=Hiduke1, After:=ActiveCell, LookIn:=xl, LookAt _ :=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _ False, MatchByte:=False, SearchFormat:=False) If Hiduke1kekka Is Nothing Then ActiveSheet.Range("D1000").End(xlUp).Select Selection.Value = "出" Worksheets("sheet1").Activate Else Worksheets("sheet1").Activate Exit Sub End If End Sub

  • Do~Loopステートメント

    Do~Loopステートメントで使わな方が良いステートメントとは? Do~Loopステートメントで「古いから使わない方がよい」、と言われたことがあるのですが どれの事だか忘れてしまいました。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do While i < 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これは一般的だから使ってもよいと思います。 Sub test() セルのA1~A10に1~10を入力する i = 1 Do Until i = 11 Worksheets("Sheet1").Cells(i, 1).Value = i i = i + 1 Loop End Sub これもよく見かけます。 Do While,Do Until以外にもloopステートメントってありますか? あと使わない方が良いステートメント、私の勘違いでなければ教えてください。

  • VBAでセルをダブルクリックとEnterを押す方法

    VBAでExcelのセルB2~B11までをダブルクリック&Enterを押す繰り返す処理をしたいので、次のようなコードでやってみましたが、セルB11~B20をダブルクリック&Enterを押す結果となりました。どう修正したらB2~B11までをダブルクリック&Enterを押す繰り返す処理になるのか教えてください。よろしくお願いいたします。 ************************************************************* Sub 編集状態とEnter() Dim i Worksheets("Sheet1").Activate For i = 2 To Cells(Rows.Count, 3).End(xlUp).Row Cells(i, 2).Activate SendKeys "{F2}" & "{Enter}" Next End Sub *************************************************************

  • SendKeys "{F2}" 後のカーソル位置

    VBAで、値が入力されているセルを編集モードにして、語尾に値を追加させようとしています。 EXCELのセルに入力されている値を編集する場合、[F2]を押して編集モードにできますが、その際カーソルは語尾にあります。 しかし、VBAのSendKeys "{F2}"で同様の操作を実行させると、カーソルは文字列の真ん中になります。 SendKeys "{RIGHT}"を追加しても、何故か左側に移るなど思い通りに機能しません。 みなさんは、SendKeys "{F2}" 後のカーソル位置は語尾になりますか?

  • VBAのSendkeysでShift付の文字になる

    ExcelのVBAでGOM Playerを動かそうと思っています。 動画の途中から時間指定で再生しようと思っていますが、再生時間を指定するための画面を出す文字コード「G」をSendKeysで送るとなぜかShiftキー付の文字コードが送られてしまっているようです。 GOM Playerでは「G」を押すと「移動先の時間を指定」画面が出るのですが、VBAで「G」を送ると、「Shift+G」で表示される「オーディオキャプチャー設定」画面が出てきてしまいます。 VBAではなく手で「G」キーを押すと何の問題もなく表示されます。 具体的に書きますと H列のセルを選ぶとH列に書いてある時間(「0:04」など)のところから再生が始まるプログラムになります。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Set 指定セル範囲1 = Range("H2:H132") Set 共有セル範囲1 = Intersect(ActiveCell, 指定セル範囲1) If Not 共有セル範囲1 Is Nothing Then Shell "C:\Program Files (x86)\GRETECH\GomPlayer\GOM.EXE", 1   SendKeys "G"   SendKeys "00:0" & Cells(Rows.Count, 8).Value End If End Sub 「Shell・・」の行はExcelがアクティブの状態からGOM Playerがアクティブの状態にするために入れてあります。 Wait時間を入れてみたり、CRを送ってからGを送ったり 下記のように別のコートで送ってもダメでした。 SendKeys ("G") SendKeys vbKeyG SendKeys 71 また「G」だけではなく「P」を送っても「Shift+P」が送られた動作になってしまいます。 すみませんが、お知恵を貸していただけませんでしょうか。 よろしくお願いします。

  • Excel、VBAのIF文で

     いつもお世話になります。 エクセルのVBAでセルF4からF65536までを選択していれば印刷して、それ以外を選択していれば「氏名セルを選択してください」と表示させたいのですが、うまくいきません。  全く構文かもしれませんが以下が作成したプロシージャです。VB初心者です。ご指導よろしくお願いします。 Sub 成績個人印刷if() If Range("f5,f65536").Activate = True Then Worksheets("個人カード").Range("a3").Value = ActiveCell.Offset(0, -4) Worksheets("個人カード").PrintOut End If MsgBox "氏名セルを選択してください" End Sub

  • エクセルVBA 1つのシートで出来ますか?

    説明が下手で申し訳ございませんが、宜しくお願い致します。 sheet(1)に20個のボタンがあります。 ボタンをクリックすると、別のシートが開きます。 開いたシートにも複数のボタンがあり、そのうちの任意のボタンをクリックすると、そのボタンの値がsheet(1)のそれぞれのボタンに対応したセルに入力される、という動作を実現したいと思っています。 現状、下記のようなコードで目的の動作は実現できてはいるのですが、各ボタンそれぞれにシートを作っているような状況です。(データ自体は全く同じ内容のものが、計20シート) たぶん、もの凄く頭の悪い事をやっているんだろうと思います。 sheet(1)を除いた各シートの入力データ自体は全く同じなので、シート一枚で出来るんじゃないのかなと思い、ネットや本で調べながら色々試してみたのですが、どうも上手く行きません。データが同じでも、sheet(1)のクリックしたボタンによって入力するセルを変えなければならないのが問題です。 sheet(1)のボタンとセルの関連付けや、sheet(1)のどのボタンを押したのかの判別ができればいいのかなと思って調べてみても、初心者にはよく理解できず、もう何週間もチャレンジしているのですがお手上げです。 上級者の方の知恵をお借りできれば幸いです。 Sub sheet2を開く() Worksheets(2).Select End Sub Sub 入力1() Worksheets(1).Range("F8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("F8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("F8") = "データ3" Worksheets(1).Select End Sub Sub sheet3を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("H8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("H8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("H8") = "データ3" Worksheets(1).Select End Sub Sub sheet4を開く() Worksheets(3).Select End Sub Sub 入力1() Worksheets(1).Range("M8") = "データ1" Worksheets(1).Select End Sub Sub 入力2() Worksheets(1).Range("M8") = "データ2" Worksheets(1).Select End Sub Sub 入力3() Worksheets(1).Range("M8") = "データ3" Worksheets(1).Select End Sub    ・    ・    ・    ・    ・

  • 初歩的な質問です!sheetの選択

    よろしくお願いします! エクセル2003,Sheet1を右クリック>コードを表示を選択して、下のように記述したところ、予想と違う動作をしました。 sheet1,2のそれぞれのA1セルに各々のsheet名を入力したかったのですが、失敗した原因はどうしてでしょうか。activateをselectにしても変わりませんでした。 初歩的なことだと思いますが、どうぞよろしくお願いします! Sub macro() Worksheets("sheet1").Activate Cells(1, 1) = "sheet1です。" Worksheets("sheet2").Activate Cells(1, 1) = "sheet2です。" End Sub

専門家に質問してみよう