1

Excel VBA について少しサポートが必要です。Excel と別のアプリケーションを切り替えてコピーし、別のアプリケーションから Excel に貼り付けています。私はすでにそのプロセスを停止していますが、現在アクティブなセルに貼り付ける方法についてアドバイスが必要ですD。実際、Excel アプリケーション内で実行する必要がある正確なプロセスのリストを次に示します。

  1. [数値形式] 現在アクティブなセルに貼り付けます (常にD:D列に配置されます)
  2. セルを 1 つ右にタブで移動
  3. [日付形式: "d-mmm"] 今日の日付
  4. タブ右
  5. [テキスト] 貼り付け
  6. タブ右
  7. 【会計】貼り付け
  8. タブ右
  9. その列に文字「X」を入力します
  10. 列から始めて、1 行下に入力しDます。

これらのすべてのステップの間に、他のアプリケーションとやり取りするコードの大部分を把握しました。しかし、それに関しても 1 つの質問があります。そのアプリケーションでは、次のステートメントを実行しています。

With ATC.ActiveSession(ATC は、アプリケーションのタイプ ライブラリを参照して、他のアプリケーションと対話するだけです)

Withアプリケーションがコピーと貼り付けを行ったり来たりするたびにステートメントを終了するのではなく、 withExcel のライブラリを使用するステートメントとして何を使用する必要がありますか?

私が起こりたくないことの例:

Sub New_ATS()

    Set ATC = GetObject(, "ATWin32.AccuTerm")

    AppActivate "AccuTerm 2K2"
    With ATC.ActiveSession
        .InputMode = 1
        .SetSelection 6, 15, 12, 15
        .Copy
        .InputMode = 0
    End With
    AppActivate "Microsoft Excel"
        Selection.Paste '(not complete, part of question)
        Selection.Offset 1, 0 'again, part of the question
    AppActivate "AccuTerm 2K2"
    With ATC.ActiveSession
        .InputMode = 1
        .SetSelection 14, 3, 20, 3
        .Copy
        .InputMode = 0
    End With
    AppActivate "Microsoft Excel"
    ' .... end of partial code (continues on)
End Sub

しかし、代わりにWithステートメントを「チェーン」したいのですが、ExcelのVBAを指すためにどのステートメントを使用するかわかりません。これは私が望むものです:

Sub New_ATS()

    Set ATC = GetObject(, "ATWin32.AccuTerm")

    AppActivate "AccuTerm 2K2"
    With ATC.ActiveSession
        .InputMode = 1
        .SetSelection 6, 15, 12, 15
        .Copy
        .InputMode = 0
        With Excels_Statement '?????
            AppActivate "Microsoft Excel"
            Selection.Paste '(not complete, part of question)
            Selection.Offset 1, 0 'again, part of the question
            AppActivate "AccuTerm 2K2"
            With ATC.ActiveSession
                .InputMode = 1
                .SetSelection 14, 3, 20, 3
                .Copy
                .InputMode = 0
                With Excels_Statement '????
                    AppActivate "Microsoft Excel"
                End With
            End With
        End With
    End With

    ' .... end of partial code (continues on)
End Sub
4

1 に答える 1

1

AccuTerm はインストールしていませんが、毎回アクティベートせずに Excel に貼り付けることができると思います。With ブロックを使用する代わりに、最小限の入力でオブジェクト変数を割り当てることができます...変数の命名のベストプラクティスではありませんが、うまくいきます。特定の型の変数を宣言すると、Excel のライブラリにアクセスできるようになります。

これが私が考えていることです...(部分的にテストされているので、少し調整する必要があるかもしれません)

Sub New_ATS()

    Set ATC = GetObject(, "ATWin32.AccuTerm")
    Dim Sesh as ATWin32.AccuTerm.Session  'Not sure this exists
    Dim XL as Excel.Range

    AppActivate "AccuTerm 2K2"
    Set Sesh = ATC.ActiveSession

    Sesh.InputMode = 1
    Sesh.SetSelection 6, 15, 12, 15
    Sesh.Copy
    Sesh.InputMode = 0

    'AppActivate "Microsoft Excel" - don't need it
    Set XL = application.activecell
    XL.PasteSpecial
    Set XL = XL.offset(0,1)

    'AppActivate "AccuTerm 2K2" - no need, still active
    Sesh.InputMode = 1               'Once this is set, do you need to set it again?
    Sesh.SetSelection 14, 3, 20, 3
    Sesh.Copy
    Sesh.InputMode = 0               'Once this is set, do you need to set it again?

    XL.PasteSpecial
    XL.NumberFormat = "General"      'Bullet #1
    Set XL = XL.offset(1,0)

    '...and so on...

    XL.PasteSpecial
    XL.NumberFormat = "d-mmm"        'Bullet #3
    Set XL = XL.offset(1,0)

    XL.PasteSpecial
    XL.NumberFormat = "@"            'Bullet #5
    Set XL = XL.offset(1,0)

    XL.PasteSpecial
    XL.NumberFormat = "_($* #,##0.00_);_($* (#,##0.00);_($* "-"??_);_(@_)"      'Bullet #7
    Set XL = XL.offset(1,0)

    XL = "X"                          'Bullet #9

    'When you've reached the end of the row
    Set XL = XL.offset(1, 4 - XL.Column)  'Since col D = 4
    'And repeat your procedure

End Sub
于 2016-07-15T02:27:58.380 に答える