プロが教える店舗&オフィスのセキュリティ対策術

下記のコードを記述しました。

最終行まで[F2〕→〔Enter]をループ
※やりたいことが不明だとは重々承知ですが、目的があり、
 質問させていただいております。

その後にメッセージBOX or 他ボタンの呼び出しをしたいのですが、
メッセージボックス or Call ボタン名 を記述しても実行されません。

改善策が分かる方いましたら、ご教授いただければ幸いです。
宜しくお願い致します。

Sub ボタン1_Click()

Dim i As Long

For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Range("A2").Activate
SendKeys "{F2}"
SendKeys "{Enter}"

Next i

MsgBox "TEST"

End Sub

A 回答 (4件)

こんにちは。



ふつう、
SendKeys "{F2}"
SendKeys "{Enter}"

それが、ワークシート上というのでしたら、F2 を押せば、セルへの入力状態になり、通常はマクロは命令待ち状態になってしまいます。したがって、行ったきりのマクロになります。

こういうスタイルは、外部オブジェクト(例えば、VBScript)からSendKeyを使わないと意味がなかったはずです。#1さんのご指摘は、正しいのですが、今回は、特例で、Return とセットとして扱うから抜けられるのだと思いました。

>やりたいことが不明だとは重々承知ですが、目的があり、

別に秘密にしなくても、この場合は、例えば、外部データをインポートした後に、データが不活性化して、文字でも数字でもない状態の時に、そのデータをExcelデータに落ち着かせるために行なう方法です。他には、IMEの変換を利用する方法なども出ているようです。

そうはいうものの、以前、そういう場合は、以下ようなマクロを使っていましたが、今は、いろんな状況が考えられますから、必ずしも正解とはいえなくなりました。

'1234 というように、プレフィックス付きの文字列 を、数値の1234に変える場合には、有効です。

Sub ボタン1_Click()
Dim rng As Range
Set rng = Range("A2", Cells(Rows.Count, 1).End(xlUp))
With rng
  .Value = .Value
End With
End Sub

区切り位置オブジェクトを使ってデータを変更させるとか、手段はいくつかあります。

'//ふだん、このようなマクロは書きません。
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Sub ボタン1_Click()
Dim i As Long
Application.ScreenUpdating = False
For i = 2 To Cells(Rows.Count, "A").End(xlUp).Row
 Cells(i, 1).Activate
 Application.SendKeys "{F2}{Enter}", True
 Sleep 200 '*
 DoEvents  'これを入れないと戻れない。
Next i
Application.ScreenUpdating = True
MsgBox "TEST"
End Sub

* この部分は、抜いても大丈夫か、試験してください。確実生を高めるために入れているだけです。あまりSleep は意味がありません。

最初の、.Value = .Value を、手動式で行った場合。
 Application.SendKeys "{F2}{F9}{Enter}", True
となります。

一度、試してみてください。
    • good
    • 1
この回答へのお礼

ご回答ありがとうございます。
丁寧に解説してくださり、大変参考になりました。無事解決いたしました。

お礼日時:2017/01/30 10:07

以下のようにしてください。


------------------------------------
Sub ボタン1_Click()
Dim i As Long
For i = 1 To Cells(Rows.Count, "A").End(xlUp).Row
Range("A2").Activate
SendKeys "{F2}"
SendKeys "{Enter}"

Next i
DoEvents
MsgBox "TEST"
End Sub
-----------------------
MsgBox "TEST"の前の行にDoEventsを追加します。
    • good
    • 0

何をやっているか全く判らないのですが、「SendKeys "{Enter}"」と「Next i」の間に「DoEvents」を入れてみたらいかがですか?



ちなみにA列のデータは内容とは関係なくループの回数にしか使われていないようですがそれで良いのですか?
    • good
    • 0

SendKeys "{F2}"



この F2を 閉じるコマンドが無いから
ループ抜けても コードは F2表示で止まってる。

手動で F2閉じたら、msgbox に進むけど・・・

F2以外で やったら??
    • good
    • 0

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

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


このQ&Aを見た人がよく見るQ&A