2

あるワークシートから別のワークシートにデータをコピー/貼り付けして、多数のスプレッドシートを生成するプログラムをExcelで作成しています(例:生成されたワークシートにコピー/貼り付けされるヘッダー/フッターセルを含む「レイアウト」ワークシートを使用) )。

私の問題は、時々(毎回ではない)、「生成プロセス」を実行すると、Excelがこのエラーを生成することです(申し訳ありませんが、これは私のフランス語のExcelエラーからの英語の翻訳です):

エラー1004:「_Worksheet」オブジェクトの「Paste」メソッドが失敗しました

だから私はクリップボードに問題があると思います(おそらく同時にクリップボードを使用した私のコンピューター上の他のソフトウェアで:/)

私は最初に、次のようなコードを使用して、クリップボードを使用せずにセル(およびその他のもの)をコピー/貼り付けする方法を見つけようとします:

ThisWorkbook.Sheets("Layout").Range("A1").Copy Destination:=ThisWorkbook.Sheets("Test").Range("A1")

またはその

ThisWorkbook.Sheets("Test").Range("A1") = ThisWorkbook.Sheets("Layout").Range("A1")

しかし、テキストまたは数式のみをコピーでき、すべてのもの(境界線、色など)はコピーできず、Chartオブジェクト(私は1つ持っています)もコピーできないようです!

だから私はコピー/貼り付け中にクリップボードをロック/ロック解除する方法を見つけようとしています。私はそれを行うためにこのコードを見つけました:

Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function EmptyClipboard Lib "user32" () As Long

Public Sub Lockk()
    If OpenClipboard(0) = 0 Then
        MsgBox "cannot open clipboard."
    ElseIf EmptyClipboard() = 0 Then
        MsgBox "cannot clear clipboard."
    End If
End Sub

Public Sub Unlockk()
    CloseClipboard
End Sub

セルをコピーするときに機能しているようです。Excelでクリップボードをロックしたり、別のソフトウェア(メモ帳など)に移動したり、このソフトウェアに一部のデータをコピーして貼り付けたりすることはできません。Excelに戻ると、データをコピー/貼り付けできます(手動またはマクロを使用)。

だが:

  • セルを貼り付けるとクリップボードのロックが解除されるようです(ロックしてメモ帳に移動できます。メモ帳はクリップボードにアクセスできません。Excelに戻り、セルをコピーして貼り付け、メモ帳に戻ってから、メモ帳にアクセスできます。クリップボード;そして私はクリップボードを明示的にロック解除していません)。それは私にとって本当に問題ではありません。

  • クリップボードをロックした後、Chartオブジェクトを(手動またはマクロを使用して)コピー/貼り付けすることはできません。マクロを使用すると、以前とまったく同じエラーが発生します)。

それで、クリップボードをロック/ロック解除してチャートオブジェクトをコピーする方法についてのアイデアとして誰かがいますか?または、クリップボードを使用せずにそれらをコピーするには?

編集:

グラフオブジェクトをコピーして貼り付けるために使用されるコード:

Utils_Clipboard.Lockk
ThisWorkbook.Sheets("Layout").ChartObjects("CHART_TEMPLATE").Copy
DoEvents
worksheet_p.Paste Destination:=where_p
Utils_Clipboard.Unlockk

ここで、worksheet_pはWorksheetオブジェクト、adnwhere_pは範囲です。最初と最後の行がない場合(クリップボードをロックする)、正常に機能していることに注意してください(しばらくの間を除く)。

4

2 に答える 2

0

わかりました。解決策を見つけました(おそらく最良の解決策ではありませんか?)

Utils_Clipboard.LockkとUtils_Clipboard.Unlockkを使用して、セルの複製(コピー/貼り付け)、セルの結合などの際にクリップボードが別のソフトウェアで使用されないようにすることができます。

しかし、クリップボードがロックされていると、チャートオブジェクトをコピーして貼り付けることができないようです(手動でctrl+cキーとctrl+vキーを押すか、vbaでオブジェクトのコピーと貼り付けの方法で自動的に)。

チャートオブジェクトの私の解決策は、関数Duplicate(http://msdn.microsoft.com/en-us/library/office/ff840956.aspx)とMove(http://msdn.microsoft.com/en-us)を使用することです。 /library/office/ff840583.aspx)このように(worksheet_pはchartobjectを配置するワークシートです):

Utils_Clipboard.Lockk
Dim newchart_l As Shape
Set newchart_l = ThisWorkbook.Sheets("Layout").ChartObjects("CHART_TEMPLATE").Duplicate
newchart_l.Chart.Location xlLocationAsObject, worksheet_p.Name
Utils_Clipboard.Unlockk

複製されたオブジェクトはChartObjectではなくShapeであることに注意してください(ChartObjectとして入力すると、コードの実行時にエラーが発生します)。

正常に機能しています(ここでクリップボードをロックする必要はないと思います)が、グラフオブジェクトが目的の場所にありません(worksheet_pの正しい左上の座標にあります)。そのためには、ChartArea(複製されたオブジェクトの親)を移動する必要があることがわかりましたが、「newchart_l」を直接操作することはできません(ExcelはDuplicateの呼び出し後にすべての内部変数を更新しないようです) 、 どうして???)。したがって、私の解決策は、最初に新しい重複チャートオブジェクトを取得することです。

Dim ChartObject_m As Chart
Set ChartObject_m = worksheet_p.ChartObjects(worksheet_p.ChartObjects.Count).Chart

次に、そのオブジェクトのchartareaを移動します(ここで、'where_p'は、charobjectを配置する範囲/セルです):

ChartObject_m.ChartArea.Left = where_p.Left
ChartObject_m.ChartArea.Top = where_p.Top

出来上がり!

于 2013-01-17T12:21:57.397 に答える
0

あなたのソリューションに触発されて、私は共有したい改善されたコードを持っています。改善点は、「ChartObjects-Collection内のグラフの順序は挿入の順序を反映している」などの仮定に依存しないことです。

Private Function copyGraph(source As ChartObject, pos As Range) As ChartObject
    ' Copies a given graph to the given position and returns the resulting 
    ' ChartObject. The destination position is expected to be a cell in the desired 
    ' target worksheet. The resulting ChartObject will be aligned to the Top/Left-
    ' Border of the given cell. 

    Dim dup As Object
    Dim dstChart As Chart

    ' First just duplicate the graph. This operation leaves it on the original 
    ' worksheet.
    Set dup = source.Duplicate

    ' In case the duplication failed, ... 
    If (Not dup.HasChart) Then
        ' ... we remove the duplicated object and leave the copy function.
        ' This yields a Nothing-reference as return value to signal the error
        ' to the caller.
        dup.Delete
        set copyGraph = Nothing
        Exit Function
    End If

    ' Then we move the graph to the target worksheet passed as parameter. This
    ' gives us the new link to the moved chart.
    '
    ' Excel displays some weired behavior when using the reference returned by ChartObject.Duplicate.
    ' Namely it yields sporadic 1004 runtime errors without further specification. However it seems,
    ' that activating the chart and calling location for ActiveChart gets around this problem.
    '
    ' Therefor the original code:
    ' Set dstChart = dup.Chart.Location(xlLocationAsObject, pos.Parent.Name)
    ' has been replaced with the following
    dup.Chart.parent.Activate
    Set dstChart = ActiveChart.Location(xlLocationAsObject, pos.Parent.Name)

    ' As we relocated the chart as an object, the parent of the chart object is
    ' an instance of ChartObject. Hence we use it as the return value.
    Set copyGraph = dstChart.parent

    ' Finally we move the graph to the requested position passed by the pos 
    ' parameter.
    With copyGraph
        .Top = pos.Top
        .Left = pos.Left
    End With
End Function

これが、この問題の簡単な解決策を探している他のユーザーに役立つことを願っています。

于 2014-12-25T10:04:18.693 に答える