[[20230929174826]] 『F2⇒エンターのみをするマクロ』(お願いマン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『F2⇒エンターのみをするマクロ』(お願いマン)

ネットで見つけたのですが
これをB列〜AC列まで
開始行を5行目から
最終行はF列の最終行までという風にできないでしょうか?

完全に神頼みの状態です…

Sub F2キー()
Dim C As Integer '列 A列だと a or 1 、C列だと c or 3
Dim FR As Integer '開始行
Dim LR As Integer '最終行

C = InputBox("列は?", "確認", "")
FR = InputBox("開始行目は?", "確認", "")
LR = InputBox("終了行目は?", "確認", "")

Dim R As Variant
ActiveSheet.Select
Cells(1, 1).Activate

For R = FR To LR
Cells(FR, C).Select
SendKeys "{F2}", True
SendKeys "{ENTER}", True
Next R

End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


他からコピペしたデータでしょうか?
(MK) 2023/09/29(金) 17:51:22

 試してないけどこういうことかな?

https://www.relief.jp/docs/003676.html
(MK) 2023/09/29(金) 17:54:26


 参考。

https://swnokoneta.com/excel-f2key-enterkey-send/
(MK) 2023/09/29(金) 18:15:35


 こんなのありました。参考まで。

https://oshiete.goo.ne.jp/qa/9611678.html
(MK) 2023/09/29(金) 18:21:24


もしかしてこれかな。

[[20220831162118]]
(MK) 2023/10/01(日) 01:16:16


 そもそも、どういう事象に対応するため、F2 + Enterを実行したいのか、
 改めて説明されたほうがよいと思います。
 そのSendKeysメソッドを使った方法は不安定ですから、
 できれば別の方法が望ましいと思います。

 コードで、
 Cells(R, C).Select ではなく、
 Cells(FR, C).Select としているのも謎。
 SendKeysの非同期性が結果オーライをもたらしている感じですね。

 # 元記事では、コメント記号も妙な記号(コンパイルエラーになる)だし、インデントしていないのも気になる。
(xyz) 2023/10/01(日) 13:10:27


 さきほど投稿しましたが内容に一部誤りがありましたので、出直します。
(xyz) 2023/10/07(土) 09:59:21

 繰り返しになりますが、質問への回答としては、
 「Sendkeysを回避する方法を推奨する」というものです。
 理由は、SendKeys命令の発出と実際の動作に遅延があり、動作が不安定になるためです。
 手段を決め打ちするのではなく、本来されたいことを書かれるのが、
 こうした質問掲示板でのうまい利用の仕方と言えます。

 SendKeysを使用する場合の研究材料とみて、少し検討してみました。
 以下の点が私の気づきです。閲覧者の参考になれば幸いです。

 ■参考となると思われるTips
 (1)
   Application.SendKeysには、NumLockキーが外れてしまったり、
   その他のキーにも影響を及ぼすことがあるというバグがあるようです。
   "WScript.Shell"のSendKeyで代替するのが適当です。
 (2)
   各列ごとの処理を Application.OnTimeを使って予約して遅延実行する方法があります。
   これでSendKeysの不安定さを緩和することができます。(完全ではないようです)
 (3)
   ただし、実行時間を Application.OnTime  Now + TimeValue("0:0:1")方式でやると
   秒未満の指定ができません。そこで
   Timerを使うことで細かい処理時刻指定ができます。
 (4)
   Application.OnTimeの予約のタスクに引数を渡す方法にも注意が必要。
   Rangeのようなオブジェクトを渡すことはできないようで、
   数値、文字列に限定されます。

 ■留意事項
 ★なお、下記のコードは実験版なので、汎用性はありません。注意ください。
 ・一回の処理時間を0.6と想定
 ・対象範囲も特定のものに決め打ち
 ・最初の予約時刻(現在の2秒後)も、上記を受けて決め打ちしています。

 ■参考コード
 Public Sub wshSendKeys(Keys As String, Optional wait As Boolean = False)
     Static wshShell As Object
     If wshShell Is Nothing Then Set wshShell = CreateObject("WScript.Shell")
     Call wshShell.SendKeys(Keys, wait)
 End Sub

 Sub F2キー()
     Dim myRange As Range
     Dim kaisu   As Long
     Dim t       As Double
     Dim startTime  As Double
     Dim args    As String
     Dim col     As Range
     Dim r       As Range

     Set myRange = [B2:AC5]  '' for debug only
     'Set myRange = Application.InputBox("対象範囲を選択", Type:=8)

     kaisu = myRange.Rows.Count  '1列の行数
     startTime = Timer + 2       '■予約処理だけで2秒かかるものとし,
                                 '最初の処理実行は現在より2秒後と設定
     '各列ごとの処理を予約
     For Each col In myRange.Columns
         t = Date + startTime / 24 / 60 / 60     '想定スタート時刻(日付単位)
         Set r = col.Cells(1)                    '列のスタートセル
         args = "'do_task " & r.Row & "," & r.Column & "," & kaisu & "'"  'do_taskと、それに渡す引数
         Application.OnTime t, args              '処理予約
         startTime = startTime + 0.6             '■一回の処理で0.6秒かかると想定
     Next
     Application.ScreenUpdating = True
 End Sub

 Sub do_task(r As Long, C As Long, kaisu As Long)
     Dim wait As Boolean
     Dim k   As Long
     wait = True
     Cells(r, C).Select
     For k = 1 To kaisu
         wshSendKeys "{F2}", wait
         wshSendKeys "~", wait
     Next
 End Sub

(xyz) 2023/10/07(土) 10:16:04


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.