|
ありがとうございます。
以下のようにしてみましたが、やはり1回目ではうまくいかず2回ペーストする必要があります。
BeginInvokeは非同期でバックグラウンドプロセスからフォアグラウンドプロセスに指令を投げるものだと思いますが、
GUIから使っても良いのでしょうか?
そして、それで遅延が発生するのでしょうか?
Dim oldCursor = Cursor.Current
Cursor.Current = Cursors.WaitCursor
Dim xlApp As Object = Nothing
Try
xlApp = GetObject(, "Excel.Application")
CallByName(xlApp, "CutCopyMode", CallType.Let, False)
Catch
Finally
If xlApp IsNot Nothing AndAlso Marshal.IsComObject(xlApp) Then Marshal.ReleaseComObject(xlApp)
End Try
BeginInvoke(Sub()
Clipboard.Clear()
RichTextBox1.Copy()
' Excel 書式を維持するため、Word 経由で複写
Dim wApp As Object = Nothing
Dim wDocs As Object = Nothing
Dim wDoc As Object = Nothing
Dim wRng As Object = Nothing
Try
wApp = CreateObject("Word.Application")
wDocs = CallByName(wApp, "Documents", CallType.Get)
wDoc = CallByName(wDocs, "Add", CallType.Method)
wRng = CallByName(wDoc, "Range", CallType.Method)
CallByName(wRng, "Paste", CallType.Method)
CallByName(wRng, "Copy", CallType.Method)
Catch
Finally
If wRng IsNot Nothing AndAlso Marshal.IsComObject(wRng) Then Marshal.ReleaseComObject(wRng)
If wDoc IsNot Nothing AndAlso Marshal.IsComObject(wDoc) Then Marshal.ReleaseComObject(wDoc)
If wDocs IsNot Nothing AndAlso Marshal.IsComObject(wDocs) Then Marshal.ReleaseComObject(wDocs)
If wApp IsNot Nothing AndAlso Marshal.IsComObject(wApp) Then
CallByName(wApp, "Quit", CallType.Method, False)
Marshal.FinalReleaseComObject(wApp)
End If
End Try
Cursor.Current = oldCursor
End Sub)
|