2

セルの範囲をコピーするプログラムがあり、その内容をコードで作成された新しいブックに貼り付ける必要があります。データをコピーできますが、ワークブックを作成した新しいワークブックに変更するたびに、どういうわけかクリップボードのデータが失われます。セルを配列にコピーしてから、配列を新しいワークブックにコピーすることを検討しましたが、コーディング時に配列のサイズがわかりません。これは、マクロが実行されるたびにほぼ異なります。アクティブなワークブックを変更している間、データをクリップボードに保持するにはどうすればよいですか?

cell = "k7: l" & row
Worksheets(1).Range(cell).Select


Selection.Copy
relpath = ThisWorkbook.Path & "\" & "DispersionList.xls"

If Dir(relpath) <> "" Then
   Application.Workbooks.Open (relpath)
   Workbooks("DispersionList.xls").Activate
Else
    Call createWorkbook
End If

Worksheets(1).Cells(7, 14).Select
Selection.PasteSpecial


End Sub

コードを1行ずつ実行してクリップボードを確認すると、workbooks.open行で内容が失われます

4

1 に答える 1

1

Excel/VBA には、ウィンドウ/ディスプレイ設定の変更など、選択/クリップボードを無効にするアクションがいくつかあります。したがって、ワークシート/ワークブックを変更すると、何らかのイベントが呼び出されると思われます。

それをデバッグし、コードのステップ実行中に、選択が無効になったときにこのステートメントを回避することができます (可能な場合)。

または、イベント コードで以下のコードからsubStoreClipboardandを使用します。subRestoreClipboardコードを使用するには、ワークシートの新しいモジュールに挿入し、VBA で "ws_Temp" という名前の新しい (非表示の) ワークシートも挿入します。

Private mIntCutCopyMode As XlCutCopyMode
Private mRngClipboard As Range

Public Sub subStoreClipboard()
    On Error GoTo ErrorHandler
    Dim wsActiveSource As Worksheet, wsActiveTarget As Worksheet
    Dim strClipboardRange As String

    mIntCutCopyMode = Application.CutCopyMode

    If Not fctBlnIsExcelClipboard Then Exit Sub


    Application.EnableEvents = False

    'Paste data as link
    Set wsActiveTarget = ActiveSheet
    Set wsActiveSource = ThisWorkbook.ActiveSheet

    With ws_Temp
        .Visible = xlSheetVisible
        .Activate
        .Cells(3, 1).Select
        On Error Resume Next
        .Paste Link:=True
        If Err.Number Then
            Err.Clear
            GoTo Finalize
        End If
        On Error GoTo ErrorHandler
    End With

    'Extract link from pasted formula and clear range
    With Selection
        strClipboardRange = Mid(.Cells(1, 1).Formula, 2)
        If .Rows.Count > 1 Or .Columns.Count > 1 Then
            strClipboardRange = strClipboardRange & ":" & _
                Mid(.Cells(.Rows.Count, .Columns.Count).Formula, 2)
        End If
        Set mRngClipboard = Range(strClipboardRange)
        .Clear
     End With

Finalize:
    wsActiveSource.Activate
    wsActiveTarget.Parent.Activate
    wsActiveTarget.Activate

    ws_Temp.Visible = xlSheetVeryHidden
    Application.EnableEvents = True

    Exit Sub
ErrorHandler:
    Err.Clear
    Resume Finalize
End Sub


Public Sub subRestoreClipboard()
    Select Case mIntCutCopyMode
        Case 0:
        Case xlCopy: mRngClipboard.Copy
        Case xlCut:  mRngClipboard.Cut
    End Select

End Sub

Private Function fctBlnIsExcelClipboard() As Boolean
    Dim var As Variant
    fctBlnIsExcelClipboard = False
    'check if clipboard is in use
    If mIntCutCopyMode = 0 Then Exit Function
    'check if Excel data is in clipboard
    For Each var In Application.ClipboardFormats
        If var = xlClipboardFormatCSV Then
            fctBlnIsExcelClipboard = True
            Exit For
        End If
    Next var
End Function
于 2013-10-01T21:27:23.923 に答える