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

お忙しいところ大変申し訳ありません、ご回答の程お願い申し上げます。

入力されるデータと列の数は毎回異なり入力された文字自体を修正するVBAを組みたいのですが、検索などで調べた結果「SendKeysステートメント」のコマンド「 SendKeys "{F2}"」というものを発見しました。

それで構文を組んでみたのですが、

Sub Macro1()

Worksheets(1).Activate
Range("A2").Activate
SendKeys "{F2}"

End sub

で単一セルを修正する事はできました。
これを「列(列は毎回固定です)の空白セルまで」というプログラムは組めるのでしょうか?

お忙しい中申し訳ありませんがご回答いただければ幸いです。

A 回答 (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

この回答への補足

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

追加補足で申し訳ありませんがご回答いただければ幸いです。

補足日時:2011/10/25 15:11
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/25 15:15

NO3です。


>他のブックの列に利用できるかどうか
 ⇒個人マクロブックの様な使用は出来無いと思います。
 
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/10/25 16:56

今まで色んなVBAの記事を見ていると、SendKeysは他に方法が無いときに使う手段のようです。


初心者が使うのは適当でないと思う。
(1)1文字だけ置換、決った文字列(数種)だけ置換など、ルール性があるならプログラムで置換を使う
などの方法を考えることでしょう。
ーー
その列のデータ最終行を掴むコードなど、毎日回答にも使われているし、WEBで照会すれば直ぐ出てくる。
こういう方法を勉強しないとVBAなど出来ませんよ。
Googleででも「エクセル データ最終行」
http://www.happy2-island.com/excelsmile/smile03/ …  など
ーー
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を使う手もある。(自分で操作する場合用か)
他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。
    • good
    • 0
この回答へのお礼

>他人に入力をやらせるプログラムを、初心者が造るのは(操作のパラエティの対処がわからないだろうから)危険ありと思う。

たしかにおっしゃるとおりだと思います。予測できない動作をしないようにこれからも勉強したいと思います。
お忙しい中サンプルコードまで提示していただいて本当にありがとうございました。

お礼日時:2011/10/25 15:17

キーボードの[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 するのでもできますよね。
    • good
    • 0
この回答へのお礼

→# SendKeys も Activate もかなり有名な欠点があるけど
 # 知った上で使っているんでしょうか。

その有名な欠点を検索して探してみます。
サンプルコードなどの組み方非常に勉強になりました、お忙しい中提示していただいてありがとうございます。

お礼日時:2011/10/25 15:19

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