🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

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

Q&A

解決済

1回答

5043閲覧

突然エクセルVBAが正常に機能しなくなった

nbotnk

総合スコア9

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

VBA

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

マクロ

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

0グッド

0クリップ

投稿2020/12/10 02:39

編集2020/12/10 02:47

よく使うマクロが突然正常に機能しなくなり、困っています。
Windows7からWindows10にアップグレードしたことしか原因として思い浮かびませんが、
アップグレードしたのは3日前で、昨日までは普通に使えました。
他のマクロにも、異常は発生していません。

マクロの内容:セル内の値のみをクリップボードにコピー

コード:
Sub CopyToClipBoard()
Const DataObjectID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69"
Dim myRng As Range
Dim tbl() As Variant
Dim i As Long
Dim j As Long
Set myRng = ActiveCell
ReDim tbl(1 To myRng.Rows.Count)
For i = 1 To myRng.Rows.Count
For j = 1 To myRng.Columns.Count
tbl(i) = tbl(i) & myRng.Cells(i, j).Text
Next j
Next i
With GetObject("new:" & DataObjectID)
.SetText Join(tbl, vbCrLf)
.PutInClipboard
End With
End Sub

コードの内容によって不具合が発生するマクロと発生しないマクロがあるようですが、
解決策が見つかりません。解決策をご存じの方がいらっしゃったら、ご教示いただけない
でしょうか。よろしくお願いします。

動作不良の内容について書き忘れていたので付け加えます。

正常:セル内の値のみがクリップボードに正しくコピーされる。
異常:正しくコピーされない。
コピーしたものを他のセルに貼り付けると「・・」となる。
テキストエディタ等に貼り付けると「」(スペース)になる。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらでも症状を再現できないので、推測ですが、

Dim tbl() As VariantDim tbl() As String
GetObjectCreateObject に変更。

vba

1Sub CopyToClipBoard() 2 Const DataObjectID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69" 3 Dim myRng As Range 4 Dim tbl() As String 5 Dim i As Long 6 Dim j As Long 7 Set myRng = ActiveCell 8 ReDim tbl(1 To myRng.Rows.Count) 9 For i = 1 To myRng.Rows.Count 10 For j = 1 To myRng.Columns.Count 11 tbl(i) = tbl(i) & myRng.Cells(i, j).Text 12 Next j 13 Next i 14 With CreateObject("new:" & DataObjectID) 15 .SetText Join(tbl, vbCrLf) 16 .PutInClipboard 17 End With 18End Sub

ActiveCell ならセル一つだけなので、下記でもいいはずです。

vba

1Sub CopyToClipBoard() 2 Const DataObjectID As String = "1C3B4210-F441-11CE-B9EA-00AA006B1A69" 3 With CreateObject("new:" & DataObjectID) 4 .SetText ActiveCell.Text 5 .PutInClipboard 6 End With 7End Sub

あるいは、「Microsoft Forms 2.0 Object Library」を参照設定しておいて(ユーザーフォームを使っているなら不要)、

vba

1 With New MSForms.DataObject 2 .SetText ActiveCell.Text 3 .PutInClipboard 4 End With

参考リンク
クリップボードとデータのやりとりをする:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

別案追記

DataObjectを使わない方法

vba

1Sub CopyToClipBoard() 2 SetCB ActiveCell.Text 3End Sub 4 5Private Sub SetCB(ByVal str As String) 6'クリップボードに文字列を格納 7 With CreateObject("Forms.TextBox.1") 8 .MultiLine = True 9 .Text = str 10 .SelStart = 0 11 .SelLength = .TextLength 12 .Copy 13 End With 14End Sub

VBA - VBAでクリップボードへのコピー|teratail

投稿2020/12/10 03:40

編集2020/12/10 04:50
hatena19

総合スコア34073

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

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

nbotnk

2020/12/10 04:24

ご回答、ありがとうございます。 ご提案いただいたコードをすべて試してみましたが、結果は同じでした。 「症状を再現できない」とのことですが、hatena19様のPCでは正常に機能する ということでしょうか?
hatena19

2020/12/10 04:28

はい、正常に動作します。 セルの値がクリップボードに格納されてます。
nbotnk

2020/12/10 04:35

やはり、そうでしたか。 Windowsのアップグレードぐらいしか原因は思いつかないのですが、 昨日までは問題なかったし、他のマクロは異常がないので、何が原因なのか 見当がつかなくて... ちなみに、ご教示いただいたコードを使って新たにマクロを作成してみましたが、 正常に機能しませんでした。 もう少し、調べてみます。
nbotnk

2020/12/10 05:06

何度もありがとうございます。申し上げにくいのですが、hatena19様のPCでは普通に動作する ということをお聞きして、PCを再起動すると、これまで通りに動作するようになりました。 一番先に行うべきことを忘れており、恥ずかしい限りです。ただ、既存のコードに改善の余地が あることがわかりましたので、ご紹介いただいた方法などを参考に書き換えてみようと思います。 ご協力ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問