アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております
下記のコードは
シート4にあるデータを
シート1に貼り付けるコードなのですが、

シート4にあるデータはオートフィルタで
抽出されています。
抽出されているのだけを シート1に貼り付けたいので図化、
全て貼り付けてしまいます。
わかる方おしえてくれませんでしょうか


Dim x
Dim wS4 As Worksheet
Set wS4 = Worksheets("4")

With wS4
x = wS4.Range("B2", .Cells(Rows.Count, 2).End(xlUp)).Resize(, 5).Value
End With

Dim wS As Worksheet
Set wS = Worksheets("1")

With wS.Range("B5")
.Clear
End With

With wS4
For i = 1 To .Cells(Rows.Count, 2).End(xlUp).Row
If .Rows(i).Hidden = False Then
With wS.Range("B5")
.Resize(UBound(x), UBound(x)) = x
End With
End If
Next
End With

Set wS4 = Nothing
Set wS = Nothing

A 回答 (2件)

こんばんは


コードを読むと何をなさりたいのか・・・分かりません
配列xの作り方か・・取り出し方を説明するべきか?
(ご質問のコードは少し添削しています)

x = .Range("B2", .Cells(.Rows.Count, 2).End(xlUp)).Resize(, 5).Value
フィルターの絞り込みに関係なく指定しているセル範囲の値をすべて配列に代入しています。
もっとも、表示セルのみを纏めてVariant配列に入れることは出来ません

表示範囲のみを配列に入れる方法は後で


With wS4
For i = 1 To .Cells(Rows.Count, 2).End(xlUp).Row
If .Rows(i).Hidden = False Then
With wS.Range("B5")
.Resize(UBound(x), UBound(x)) = x
wS4表示行でwS.Range("B5")基準で配列xを出力していますが
For i = 1 To で何度も同じ処理を行う事が希望なのでしょうか?

もし、配列は1行のみ(複数行でも良いけれど)で繰り返すなら
Range("B5")は変数であるはず・・または、ResizeはOffsetなのか?
もし1つでも非表示行があったら・・と言う事であれば、処理後 Exit for が必要ですね
For i = 1 To .Cells(Rows.Count, 2).End(xlUp).Row
If .Rows(i).Hidden = False Then
のコードがなぜ必要なのかが分かりません。

単純にwS4の絞り込んだ範囲をwS.Range("B5")基準範囲に代入するのであれば、コピペの方が簡単です・・(範囲指定・・Ctrl+g・・などから基本となるコードの記録も出来るかと・・)
しかし、処理速度などを考慮し配列にしたいと言う事であれば、

一例です
Dim x()
Dim wS4 As Worksheet
Set wS4 = Worksheets("4")

Dim i As Long, j As Long
Dim Rng As Range, r As Range

Dim wS As Worksheet
Set wS = Worksheets("1")
With wS4
Set Rng = .Range("B2", .Cells(.Rows.Count, 2).End(xlUp)).SpecialCells(xlCellTypeVisible) '1列の可視セル範囲
ReDim x(1 To Rng.Count, 1 To 5) 'Resize(,5)
For Each r In Rng
i = i + 1
For j = 1 To 5
x(i, j) = r.Cells(1, j) 'r基準のcell位置
Next
Next
End With
With wS
.Cells.ClearContents
.Range("B5").Resize(UBound(x, 1), UBound(x, 2)) = x
End With
    • good
    • 0
この回答へのお礼

いつもお世話になっております
すこし、難しそうですね
けど 思い通りに動作いたしました。
ありがとうございました。

お礼日時:2022/07/10 07:59

オートフィルタでデータを抽出し、別シートに貼り付ける


http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/p …

こちらの際とは最初の頃参考になりましたよ。

配列での処理って事に拘るのであるなら、確か少し前にも質問立ててませんでしたか?
その時どうなったのかはわかりません。
⇒既に解決済みになってたと思います。

少なくとも配列変数:x に格納したデータ量より

>If .Rows(i).Hidden = False Then

この分少なくなりますよね?
だから別の配列が必要でしょうけど、非表示を除外するなら結局配列を調べるのではなくセルオブジェクトを調べるので、あまり意味がないような感じが個人的にします。

また手作業でやってみると、非表示かどうかは関係なく『表示されている物だけ』コピペできることが確認出来ますよ。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2022/07/10 07:58

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!