質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

1回答

7739閲覧

実行時エラー '-2147221040(800401d0)': DataObject:PutInClipboard OpenClipboardに失敗しました

ryuujinn

総合スコア72

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2017/07/10 03:47

Windows10 64bit excel2016で以下のマクロを実行すると

実行時エラー '-2147221040(800401d0)': DataObject:PutInClipboard OpenClipboardに失敗しました

とエラーが出てしまいます

デバックしてみると

.PutInClipboard 'クリップボードに格納

上記の部分が悪いようなのですがどのように修正すればいいのでしょうか?

Sub test() Dim sht As Worksheet 'Set sht = Sheets("test1") 'シート名は任意に指定 Set sht = ActiveSheet 'アクティブシートでマクロ実行する場合はこちらでも可 Dim aryPtn As Variant Dim ptn As Variant aryPtn = Array("、", "。", "★", "」", "」", ")", "\)", "\!", "\?", "!", "?", "・+") Dim strOutput As String '結果出力用 Dim strLine As String '1行に出力する文字列 Dim strRest As String '未処理の文字列 'セル(G23)から文字列を取得 strRest = sht.Range("G23").Value Dim iLen As Integer iLen = -1 'ループ処理 Do '先頭31文字を切り出す strLine = Left(strRest, 31) '文字長の初期化 iLen = -1 '置換パターンの数だけループ処理 For Each ptn In aryPtn '最後にマッチした区切り文字までの文字長を調べる Dim iLenWk As Integer iLenWk = FindEx(strLine, ptn) If iLenWk > iLen Then '長い文字長を採用していく iLen = iLenWk End If Next If iLen > 0 Then '区切り文字が見つかった場合、文字列を切り出す strLine = Left(strLine, iLen) End If '切り出した文字列を出力 strOutput = strOutput & strLine '切り出した文字列分を未出力文字列から除去 strRest = Mid(strRest, Len(strLine) + 1) If strRest = "" Then '未出力文字列がなくなったら終了 Exit Do End If '次の行を作る前に改行を追記 strOutput = strOutput & vbLf & vbLf Loop ''結果をP10セルに出力 sht.Range("P10") = strOutput '結果をクリップボードに出力 Dim objClip As New DataObject With objClip .SetText strOutput 'クリップボードにセットする値を指定 .PutInClipboard 'クリップボードに格納 End With End Sub '正規表現検索(最終マッチ文字までの文字長を返す) Function FindEx(ByVal vsTarget As String, ByVal vsPattern As String) As Integer Dim iIdx As Integer Dim objReg As Object Dim objMatchs Set objReg = CreateObject("VBScript.RegExp") With objReg .pattern = vsPattern .IgnoreCase = True .Global = True '正規表現検索 Set objMatchs = .Execute(vsTarget) If objMatchs.Count = 0 Then 'マッチしなかった場合-1 FindEx = -1 Else 'マッチ数を取得 iIdx = objMatchs.Count - 1 'マッチした候補の最終文字列までの文字長を返す FindEx = objMatchs(iIdx).FirstIndex + objMatchs(iIdx).Length End If End With Set objReg = Nothing End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

他のアプリケーションでクリップボードが利用されていると、VBA がクリップボードのオーナーになれず、そのエラーが出るそうです。

以下の URL を参考に、クリップボードを初期化してみてください。

https://msdn.microsoft.com/ja-jp/library/cc430068.aspx

投稿2017/07/10 04:12

tukuroku

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryuujinn

2017/07/11 04:01

tukurokuさん、コメントありがとうございます 具体的にはクリップボードの初期化のコードをどこに追記すればいいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問