[[20230204182153]] 『可視セルでの値貼り付け』(ひろこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『可視セルでの値貼り付け』(ひろこ)

お世話になります。

可視セルの値貼り付けをしたく質問させてください。
下記構成のエクセルがあり、A列を(する)でフィルタかけた際の可視セルコピー
の方法を教えて頂けないでしょうか?
B列およびC列は見た目は 同じ数字が入っておりますが、B列は数式、C列は値貼り付けのセルになっております。

	A	B		C
1	する	1		1
2	する	2	=B1+1	2
3	しない	3	=B2+1	3
4	する	4	=B3+1	4
5	しない	5	=B4+1	5
6	する	6	=B5+1	6
7	する	7	=B6+1	7
8	する	8	=B7+1	8
9	しない	9	=B8+1	9
10	する	10	=B9+1	10

例えば D列にB列の内容、E列にC列の内容を可視セルコピーすると
オリジナルの書式(数式)が維持され、下記のような差が生じます。

	D	E
1	1	1
2	2	2
3		
4	1	4
5		
6	1	6
7	2	7
8	3	8
9		
10	1	10

そこで質問ですが、数式を含むB列を可視セルコピーによって、
E列のような貼り付け結果とするにはどのようにしたらよろしいでしょうか?

< 使用 Excel:Excel2010、使用 OS:Windows11 >


Bの式をAがするだったら$B$1:B直上の行のmax+1にしてみては?
(通りすがり) 2023/02/04(土) 18:53:04

 こういうこと?
 B1 =IF(A1="する",ROW(),"")
(フォーキー) 2023/02/05(日) 08:14:09

通りすがりさん、フォーキーさん

ご検討ありがとうございます。
ご質問させていただいた際に提示しました B列の式(1行上のセルに1を足す)というのは、あくまで簡単な事例として記載しましたので、実際は、複雑な数式が入っております。

ですので、質問は、数式を含む可視セルコピーによって、
E列のように値貼り付けするにはどのようにしたらよろしいでしょうか?
となります。

引き続き ご教授いただけましたら 幸いです。

(ひろこ) 2023/02/06(月) 01:00:34


私の勘違いかもしれませんが、可視セルのコピペで提示されているような結果(E列)にならないと思うんですが。
フィルタ状態だとコピー対象は可視セルだけですけど、貼り付け先は可視セルを無視するので空白は出来ないはずです。
あと何故か、フィルタ状態の数式セルをコピペすると数式が値になってました。
貼り付けオプションを数式にして貼り付けは正常に動くんですが、通常貼り付けだと勝手に値になります。
これは仕様ですかね。
(フォーキー) 2023/02/06(月) 06:09:45

まったく同じことを投稿しようとしていました。
そのような空白行が入るような貼り付けはできません。
上から詰めて張り付きます。

私見では、
(1)可視セルだけをコピーすることはできますが、
  可視セルだけに貼り付けることは仕様上できないのではないかと思います。
  (コピー元が一行の場合は除きます。)
(2)そもそもですが、フィルタがかかっているデータだけ、値に変更するとは、
  どんな状況なんでしょう。
  値に変更してから、フィルタをかけるのではNGなんですか?
(3)フィルタ対象外のデータは、空白にしたいのであれば、(2)を実行したのちに、
  再度、フィルタ条件を逆にしたものでフィルタして、それらを消去すればよいと思います。

(abc) 2023/02/06(月) 06:29:58


 >E列にC列の内容を可視セルコピーするとオリジナルの書式(数式)が維持され、
 >下記のような差が生じます。

どのようなコードを書いたらそうなるか提示されてませんが、
期待した結果が得られないのであれば、
「書いた」と思うのは単なる思い込みで、
実際にはそう書かれてないのだろうと思います。

>>マクロの記録の結果<<

Sub Macro1()
'
' Macro1 Macro
'

'

    Columns("B:C").Select
    Selection.Copy
    Range("D1").Select
    ActiveSheet.Paste
    Range("A3").Select
    Application.CutCopyMode = False
    Selection.AutoFilter
    ActiveSheet.Range("$A$1:$E$11").AutoFilter Field:=1, Criteria1:="しない"
    Columns("D:E").Select
    Selection.SpecialCells(xlCellTypeVisible).Select
    Selection.ClearContents
    Range("A4").Select
    Selection.AutoFilter
End Sub

エクセルには飛び飛びのセル範囲に貼り付けるという機能はないので、一捻りが必要。
こういうのは、逆転の発想をすると期待した結果が得られることが多いかも。

整理したらこんなとか。

Sub Macro002()

    Dim rngTable As Range
    Dim rngOld As Range
    Dim rngNew As Range

    With Range("A1").CurrentRegion
        Set rngTable = .Cells
        Set rngOld = Intersect(.Columns("B:C"), .Offset(1))
    End With
    Set rngNew = rngOld.Offset(, rngOld.Columns.Count)

    rngOld.Copy rngNew

    rngTable.AutoFilter Field:=1, Criteria1:="しない"
    rngNew.SpecialCells(xlCellTypeVisible).ClearContents
    rngTable.AutoFilter
End Sub

(まっつわん) 2023/02/06(月) 18:36:23


あ。値貼り付けを失念してました。
失礼しました。

ま、あとはご自分で試行錯誤してみてください。
勉強なので。。。
(まっつわん) 2023/02/06(月) 18:41:13


マクロに突っ込む前に、事実関係を質問者さんがきちんと認識することがスタートポイントだと思います。
つまり、やみくもにコードと格闘する前に、その作業の目的をきちんと評価するとか、
Excelでできることをきちんと調べる必要があります。
急がば回れですよ。

(abc) 2023/02/06(月) 18:49:58


フォーキーさん、abcさん

ご投稿ありがとうございます。
提示したE列のような空白行ができる貼り付けができないのでは?とのご指摘ですが、
フィルターをかけた列状態で 真横にコピペ(フィル)すれば 提示したような空白行が生じます。
なりませんでしょうか? 私は なりますが...。

可視セルを選択しCtrl +V後の、Ctrl + Cのいわゆるコピペでは、空白行生じないと思いますが、
可視セルを選択した後の、ctrl 押しながらの ctrl +R などの fill作業になります。
言葉足らずの説明でしたら 申し訳ございません。

(abc)さん どんな使用ケースを想定しているかとのご質問ですが、
フィルターを掛けた状態で、可視セル選択し、その可視セルだけ数式を値貼り付けでテキスト化したいという用途になります。

(まっつわん)マクロの提示ありがとうございます。
イチ作業として 頻繁に実施したく、キーボード操作で行えないものかと ご相談です。
わがまま 申し上げてすみません。

引き続き コメントアドバイスいただけましたら幸いです。
仕様でできない。が 答えなのでしょうか?

(ひろこ) 2023/02/11(土) 02:15:55


なるほど、飛び地の領域にもフィルできるんですね。2回繰り返せばよいと。それは失礼しました。

CTRL+Rと値複写機能を併せ持った機能は、標準装備されていないでしょう。
ですから、既に書きましたが、
・フィルタを掛ける前に、値複写をして、
・そのうえで、クリアする行をフィルタしてdelete
すればよいと思いますよ。

(abc) 2023/02/11(土) 06:50:21


 被ったけど、せっかく書いたので投稿します。

 Ctrl+Rでの可視セルコピー操作の事だと思いますが、一般操作でお望みの事はできないと思います。
 ある意味、数式の列は「上の値+1」で辻褄があっているし...
 キーボードによるショートカットで実現したいなら、マクロになりますが、以下でどうでしょう? 

 以下のマクロをコピペして、
 (1)「.xlsm」形式で保存。
 (2)一旦、閉じる
 (3)再度、開く
 (4)フィルター適用後、Ctrl+Q
 (5)貼り付け先を選択して、Ctrl+V

 ------------Thisworkbook------------
 Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.OnKey "^q"
 End Sub

 Private Sub Workbook_Open()
    Application.OnKey "^q", "SetClipBoard"
 End Sub

 ------------標準モジュール------------
 Sub SetClipBoard()
    Dim targetRng As Range, s$
    Set targetRng = ActiveWindow.RangeSelection
    If targetRng.CountLarge = 1 Then
        If Not targetRng.EntireRow.Hidden Then s = targetRng.Value
    Else
        Dim v, r&, c&, ss
        v = targetRng
        ReDim ss(1 To UBound(v))
        For r = 1 To UBound(v)
            For c = 1 To UBound(v, 2)
                If targetRng.Cells(r, c).EntireRow.Hidden Then v(r, c) = Empty
                s = IIf(c = 1, v(r, c), s & vbTab & v(r, c))
            Next
            ss(r) = s
        Next
        s = Join(ss, vbCrLf)
    End If
    If s <> "" Then
        With CreateObject("Forms.TextBox.1")
            .MultiLine = True
            .Text = s
            .SelStart = 0
            .SelLength = .TextLength
            .Copy
        End With
    End If
 End Sub
(まる) 2023/02/11(土) 07:02:10

 >仕様でできない。が 答えなのでしょうか?

そうですね。機能一つでは出来ませんので、複数手順を組み合わせることになります。

この手の場合は、一旦全部コピペしてから、
不要なものをフィルターで抽出し、
表示されているものをクリア

という手順が一案で、
提示したマクロはそのような手順が書いてあります。

別案としては、一旦数式を入れて、
それを値に直すという手順もあるかと思います。

手動の操作でということならば、数式の方がいいかもですね。

(まっつわん) 2023/02/11(土) 08:57:26


(abc)さん、(まる)さん、(まっつわん)さん

ご検討、ご回答ありがとうございました。
仕様上できなくて 作業列で処理した後に コピー(fill)で戻すしかないということですね。

(ひろこ) 2023/02/12(日) 23:44:19


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.