[[20260123140234]] 『空白セルを除いたセルだけを選択』(訓練中) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) |

| 全文検索 | 過去ログ ]

 

『空白セルを除いたセルだけを選択』(訓練中)

以下のようなデータから「空白セルを除いたものだけ」を別のセル範囲に値の代入をしたいです。

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


> 「空白部分を除いたセル範囲」をRangeオブジェクトにできれば、
> Countプロパティを取得して、代入する先の範囲をResizeして値の代入はできると思うのですが、

 ただし、上記のrngは複数のAreaの集合なので、

 Range("C1").Resize(rng.Count).Value = rng.Value

 などとしても希望の結果にはならない。
 コピーなら希望の結果になります。

 rng.Copy Range("C1")

(hatena) 2026/01/23(金) 15:07:26


hatena様
ご回答ありがとうございます。

>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.