『空白セルを除いたセルだけを選択』(訓練中)
以下のようなデータから「空白セルを除いたものだけ」を別のセル範囲に値の代入をしたいです。
A1セルからA21セルまでに以下のように入っています。
このデータの空白部分を除いたセル範囲の値を、C1から行方向のセル範囲に値の代入をしたいのです。
読み込むデータはNASにある読み取り専用のExcelファイルで、
値の代入先は、ローカルのマクロ付きExcelファイルです。
ここは今回は問題ありません。
「空白部分を除いたセル範囲」をRangeオブジェクトにできれば、
Countプロパティを取得して、代入する先の範囲をResizeして値の代入はできると思うのですが、
定数と数式両方のセルのみを選択することができていません。
「空白部分を除いたセル範囲」なので、
定数の範囲と数式の範囲を範囲指定すればできるかな?
と思ってtestというコードを書いたのですが、
実行結果は、
空欄セルを含めたA1セルからA11セル(2 ←このセルは「=1+1」という数式)
のところまでが選択されてしまします。
やはりループ処理を使うか、
「読み取りデータを一旦ローカルのファイルのどこかのシートに仮入れして
空白セルだけを削除して、そのセル範囲を指定の範囲に入れる」
又は
「ループ処理で空欄セルは読み飛ばす」しか方法はないのでしょうか。
どなたか「空白部分を除いたセル範囲」を指定する方法をご存じの方、
教えていただけないでしょうか。
よろしくお願いいたします。
【データ】
A列
aaa
15
8
4
gggg
2 ←このセルは「=1+1」という数式
7
ccc
hhh
40 ←このセルは「=5*8」という数式
13
Sub test()
Dim rngA As Range
Dim rngB As Range
Dim rng As Range
'該当せるが選択できるか試す
Range("a1:a31").SpecialCells(xlCellTypeConstants, 1 + 2 + 4 + 16).Select
Range("a1:a31").SpecialCells(xlCellTypeFormulas, 1 + 2 + 4 + 16).Select
'Range型オブジェクト変数に該当セルを参照させる
Set rngA = Range("a1:a31").SpecialCells(xlCellTypeConstants, 1 + 2 + 4 + 16)
Set rngB = Range("a1:a31").SpecialCells(xlCellTypeFormulas, 1 + 2 + 4 + 16)
'該当せるが選択できるか試す
Range(rngA, rngB).Select '空欄セル以外が選択できていない
Set rng = Range(rngA, rngB) 'やりたいことはこの行
End Sub
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
Set rng = Range(rngA, rngB) 'やりたいことはこの行
のコードを下記でどうでしょう。
Set rng = Union(rngA, rngB)
(hatena) 2026/01/23(金) 14:54:30
ただし、上記のrngは複数のAreaの集合なので、
Range("C1").Resize(rng.Count).Value = rng.Value
などとしても希望の結果にはならない。 コピーなら希望の結果になります。
rng.Copy Range("C1")
(hatena) 2026/01/23(金) 15:07:26
>Set rng = Union(rngA, rngB)
でできました。
また、ご指摘の通り
>Range("C1").Resize(rng.Count).Value = rng.Value
でできない事も勉強になりました。
>rng.Copy Range("C1")
で思っていた結果になりました。
これで実際のファイルでできそうです。
本当にありがとうございました。
(訓練中) 2026/01/23(金) 15:24:15
1列データならFILTER関数の利用でも
Dim r As Range
Dim v
Set r = Range("a1:a31")
v = r.Parent.Evaluate("filter(" & r.Address & "," & r.Address & "<>"""")")
(マナ) 2026/01/25(日) 12:42:46
以下のコードでも思った事が出来ました。
Sub test2()
Dim r As Range
Dim v As Variant
Set r = Range("a1:a31")
v = r.Parent.Evaluate("filter(" & r.Address & "," & r.Address & "<>"""")")
Range("c1:c" & UBound(v)).Value = v
End Sub
普段ワークシート関数のFilterを使っているのですが、
VBAからFilter関数を使う事を思いつかなかったです。
訓練中の私にとっては、複数の手段を学べることは
本当に有益です。
改めまして、hatena様、マナ様、
ご回答ありがとうございました。
(訓練中) 2026/01/26(月) 09:35:08
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.