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

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

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

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

Q&A

解決済

2回答

3872閲覧

非表示セルのコピーについて

ice930

総合スコア99

VBA

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

0グッド

1クリップ

投稿2021/01/12 13:05

編集2021/01/13 20:45

以前に似たような質問をしましたが、勘違いで「解決済」としていたので再度質問いたします。
C列を非表示として以下のコードを実行すると、コピーモード(セルが点線で囲まれる)になりますが、Ctrl + V キー等で貼り付けると、文字が無く改行のみが貼り付けられます。

Cells(3, 3).Copy

非表示を解除すると問題なくコピーされるので、一旦解除してから → コピー → 再び非表示 というコードにしたのですが、再非表示するとコピーモードが解けてしまいます。

Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = False’質問用にコードを作ったので、範囲についてRange(Cells(3, 3), Cells(3, 3))と元のコードに近いものを記載しました。 Cells(3, 3).Copy Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True

このプロシージャが終了してもコピーモードが継続し、非表示部分もそのままの状態で Ctrl + V で貼り付けできる状態にしたいのですが、良い方法はないでしょうか?

本来、.COPY でコピーした場合は、他のシートやセル等に張り付けする場合等が多いでしょうが、今回は、Ctrl + Vで、ブラウザの検索窓やメモ帳に張り付けることが目的です。

プロシージャ終了後のシートの非表示状態とCtrl + Vでの文字列の貼り付けが可能であれば、コピーモードが継続していなくとも構いません。

アドバイスいただきたく質問いたしました。
よろしくお願いします。

~以下追記部分です~

上記プロシージャですが、質問用で「標準モジュール」に入力したものでして、現在ご回答いただいた回答ですべて問題なく処理されました。(ありがとうございます!!)

今回の質問の元となった問題点なのですが、「クラスモジュール」に記載されたプロシージャで有り、こちらに同様の手法を用いると Ctrl + V では空欄の貼り付けになってしまい、これを解決したく追記で質問いたしました。
(最初の時点でモジュールの種類が問題ではないと思い記載しませんでした・・・。申し訳ありません。)

Private Sub tgtctrl_Click() Dim intRow As Long Dim URL As String Dim intcol As Long Dim i As Long MsgBox "コピーしました" i = tgtctrl.Tag intRow = tgtrange.Row intcol = 5 + 2 * i ECOL = 1 Do While Cells(2, ECOL) <> "" If InStr(Cells(2, ECOL), "URL") > 0 Then SCOL = ECOL End If ECOL = ECOL + 1 Loop SCOL = SCOL + 1 ECOL = ECOL - 1 Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("パスワード") ActiveSheet.Unprotect Dim x '変数宣言 x = Cells(intRow, intcol).Value '値のみ取得 With New DataObject .SetText x .PutInClipboard .GetFromClipboard'変数確認用 a = GetText'変数確認用 End With MsgBox a'変数確認用 ActiveSheet.Protect End Sub

フォームに配置された「コピーボタン」を押すとおこるイベントです。
1月13日時点でアドバイスいただいた方2名の方のコードを参考に作成しました。

一部確認用で配置したコード(3行)も有り、そのまま残しています。('変数確認用とコメント入れています。)

以下については確認しています。

  • Microsoft Forms 2.0 Object Library の参照設定はされていました。
  • ステップインでCells(intRow, intcol)の文字列は問題なく参照されていました。
  • 変数xに文字列は問題なく参照されていました。

以下は現在の状況です。

  • エラーは起こりませんが、Ctrl + V で貼り付けを行うと空欄が貼り付けられる。
  • クリップボードから文字列を取り出し(a = GetText)表示させると空欄になる。(クリップボードに変数xが入っていない?)

クラスモジュールからクリップボードへの貼り付けは不可能でしょうか。
原因やこの場合のクリップボードへの貼り付け方法についてアドバイスいただければ有難く思います。

よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/01/14 00:45

そもそも x = Cells(intRow, intcol).Value '値のみ取得 の時点でxに値を取得出来ていますか?
ice930

2021/01/14 01:51

ローカルウインドウで確認しています。 念のため、「Msgbox a」の下に「Msgbox x」を挿入し確認しました。 「Msgbox x」には目的の文字列が表示されているので、そこまでは行っている様なのですが・・・。
退会済みユーザー

退会済みユーザー

2021/01/14 02:06

すみません 回答を編集した後に追加でこちらでも調べましたが、どうもDataObject自体の不具合の可能性があるようです。 https://teratail.com/questions/190985 web上でも同様の報告が多数あり、マイクロソフトも認識しているようです。 WindowsAPIによる代替を提案していますが、私はまだ使用したことがないためお伝えする事が出来ません。 こちらのサイトが参考になるかもしれません。 https://www.ka-net.org/blog/?p=7537
退会済みユーザー

退会済みユーザー

2021/01/15 01:58

私も今回の件は勉強になりました。 お力になれてなによりです。
guest

回答2

0

ベストアンサー

既にDataObjectでの答えが投稿されているため、その他の補足を追加します。
.Copyではなく.Valudeを使用すれば非表示でも値を取得出来ます。
また値の保持は変数を用いた方が容易だと思います。

VBA

1Sub main() 2 3Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True 4Dim x '変数宣言 5x = Cells(3, 3).Value '値のみ取得 6SetClipboard (x) 7End Sub 8 9Private Sub SetClipboard(ByRef aText As String) 10 With New DataObject 11 .SetText aText 12 .PutInClipboard 13 End With 14End Sub

参考コード エクセルの神髄

セルの直接的な操作は動作が非常に重いため複数の処理を行った場合、著しく遅くなります。
配列も使用出来れば良いのですが使わなくても動作します。
今回はRange(Cells(1, 1), Cells(3, 3))の範囲を取得してx(3, 3)だけ取り出した例です。

VBA

1Sub second() 2 3Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True 4Dim x '変数宣言 5x = Range(Cells(1, 1), Cells(3, 3)) 'セル範囲を配列取得 6SetClipboard (x(3, 3))'コード内容が変わらないため省略 7End Sub

参考文献 エクセルの神髄 VBAの配列まとめ(静的配列、動的配列)

ではなぜVBAで配列必須になるかと言うと、

セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。

Excelの挙動に影響されないように変数へデータを逃がせば同様の問題は起こらなくなると思います。

【追記】
下記コードを一からステップインで確認して下さい。
ローカルウィンドウに変数のデータが表示されるので、変数xの中身は確認できます。

VBA

1Option Explicit 2 3Sub main() 4 Dim obj As New Class1 5 With obj 6 .SetClipboard 7 End With 8End Sub 9 10【クラスモジュール作成 クラス名:class1】 11Public Sub SetClipboard() 12 Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True 13 Dim x '変数宣言 14 x = Cells(3, 3).Value '値のみ取得 15 16 With New DataObject 17 .SetText x 18 .PutInClipboard 19 End With 20End Sub

そして追加で調べた結果、下記を質問への追記へ投稿しましたがこちらにも記載します。

すみません
回答を編集した後に追加でこちらでも調べましたが、どうもDataObject自体の不具合の可能性があるようです。
https://teratail.com/questions/190985
web上でも同様の報告が多数あり、マイクロソフトも認識しているようです。
WindowsAPIによる代替を提案していますが、私はまだ使用したことがないためお伝えする事が出来ません。
こちらのサイトが参考になるかもしれません。
https://www.ka-net.org/blog/?p=7537

投稿2021/01/13 00:39

編集2021/01/14 02:09
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

今回は、Ctrl + Vで、ブラウザの検索窓やメモ帳に張り付けることが目的です。

クリップボードにセルの値を送りたいということですね。
下記でどうでしょうか。

vba

1 With New MSForms.DataObject 2 .SetText Cells(3, 3).Value 3 .PutInClipboard 4 End With

参照設定が必要な場合がありますので、下記を参照してください。

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

投稿2021/01/12 13:20

hatena19

総合スコア33715

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問