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

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

ただいまの
回答率

88.32%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 219

ice930

score 65

以前に似たような質問をしましたが、勘違いで「解決済」としていたので再度質問いたします。
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が入っていない?)

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

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • msuguru

    2021/01/14 11:06

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

    キャンセル

  • ice930

    2021/01/15 09:22

    https://www.ka-net.org/blog/?p=7537
    こちらを引用して解決することが出来ました!!
    親身に回答いただきありがとうございました!

    キャンセル

  • msuguru

    2021/01/15 10:58

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

    キャンセル

回答 2

checkベストアンサー

+2

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

Sub main()

Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
Dim x '変数宣言
x = Cells(3, 3).Value '値のみ取得
SetClipboard (x)
End Sub

Private Sub SetClipboard(ByRef aText As String)
    With New DataObject
        .SetText aText
        .PutInClipboard
    End With
End Sub

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

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

Sub second()

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

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

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

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

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

Option Explicit

Sub main()
    Dim obj As New Class1
    With obj
        .SetClipboard
    End With
End Sub

【クラスモジュール作成 クラス名:class1】
Public Sub SetClipboard()
    Range(Cells(3, 3), Cells(3, 3)).EntireColumn.Hidden = True
    Dim x '変数宣言
    x = Cells(3, 3).Value '値のみ取得

    With New DataObject
        .SetText x
        .PutInClipboard
    End With
End Sub


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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る