2

Excel VBA を使用して、Access ファイルから選択したテキストをコピーしています (理由については詳しく説明したくありません)。タブキーを押す必要がある Do While ループにあり (動作)、データをコピーし (失敗)、それをクリップボードに入れ (動作)、クリップボード情報を変数に設定し (動作)、次に、デバッグ目的で、変数の debug.print を実行します (機能します)。これは、フォームを循環して、タブなどを 100% 使用してフォームの他の部分に移動できる「基点」に到達することです。コードを参照してください:

AppActivate ("Microsoft Access - Filename that is constant")

X = 0
Do While X < 14
Application.SendKeys "{TAB}", True
Application.SendKeys "^C", True

Sleep (500)

mydata.GetFromClipboard
cb = mydata.GetText

Debug.Print (cb)
If Len(cb) = 5 Then
X = 14
End If
X = X + 1
Loop
Set mydata = Nothing

これを機能させようとしましたが、役に立ちませんでした。私は何を間違っていますか、それともより良い解決策は何ですか?

4

2 に答える 2

0

Sendkeysで聞いてみようか迷ったのですが、聞かないでと言われたので罠はしておきます。:P

この小さな修正を試してみてください... これが機能する場合は、次の sendkeys コマンドを発行する前に、しばらく時間がかかることを意味します。

Sub Sample()
    '
    '~~> Rest of your code
    '

    Application.SendKeys "{TAB}", True

    Wait 2

    Application.SendKeys "^{C}", True

    '
    '~~> Rest of your code
    '
End Sub

Private Sub Wait(ByVal nSec As Long)
    nSec = nSec + Timer
    While nSec > Timer
        DoEvents
    Wend
End Sub

より良い解決策は何ですか?

ここに示すように API を使用します。これはあなたの質問に直接答えるものではありませんが、概念がどのように機能するかを説明しています。

それを適用すると、このようなものになります

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Dim Ret As Long

Sub Sample()
    Ret = FindWindow(vbNullString, "Microsoft Access - Filename that is constant")

    If Ret <> 0 Then
        MsgBox "Window Found"
    Else
        MsgBox "Window Not Found"
    End If
End Sub

のような API を使いこなしたい場合は、システムのプロセス、スレッド、ウィンドウ、およびウィンドウ メッセージをグラフィカルに表示するツールを入手してFindWindowくださいFindWindowExSendMessage例:uuSpyまたはSpy++. この API の使用方法を示す別の例。

于 2015-05-12T21:51:49.360 に答える