Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 11 Pro : Excel 2016)
名前付き範囲の一部のデータを消去するには?
投稿日時: 23/07/04 23:05:07
投稿者: TiTi

A2:H6に範囲名XXを設定しています。
各行のB列〜C列、D列〜F列、G列〜H列を結合しています。
 
この状態で、範囲名XXを使って、項目B、項目C、項目Dのデータを削除(消去)したいです。
Range("XX").ClearContentsとすると、当然ですがすべてのデータが消えてしまいます。
(セルアドレス(B2、D2など)を指定して個別に削除することはできますが)
 
A列(項目A)を残してその他のデータを削除するには、どうしたら良いのでしょうか?
実際とは異なりますが、下記のようなデータです。
 
今後、範囲名XXの位置や大きさが変わる可能性があるので、このようなことを思いつきました。
 

 A列  B列C列 D列E列F列   G列H列						
項目A  項目B   項目C       項目D	
123-1   AA     12340       12-1	
123-2	BB     19856       23-6	
123-3	C      36540        5-6	
141-1	DDD     2356       4-12	
151-2	EF      0215        8-8

                        
                            
                            
                            
                            

回答
投稿日時: 23/07/05 07:11:37
投稿者: WinArrow

最初に
セルを結合している場合は、
結合範囲に左上のセルのみに「値」等が入っているということを認識してください。
特に、Offsetを使う場合は、このことを意識する必要があります。
  
Range("範囲名").Cells(y,x)のような形式で、個々のセルをアクセス可能ですし、
Cells(Range("範囲名").Row + y,Range("範囲名").Column + x)のような形式でもセルを指定することも可能です。
  
  
それから、
範囲名に行を追加する操作について
単純に空白行にデータを入力すると、範囲名の外になり、
セルの書式設定や、結合の操作が必要になります。
  
1つ上の行をコピー挿入するとよいでしょう。
範囲名が参照しているセル範囲は、自動で拡張されまし。
  
※データ処理を目的とする場合、結合セルは極力使わない方が扱いやすいです。
  
 

回答
投稿日時: 23/07/05 07:25:58
投稿者: WinArrow

引用:
Range("範囲名").Cells(y,x)のような形式で、個々のセルをアクセス可能ですし、
Cells(Range("範囲名").Row + y,Range("範囲名").Column + x)のような形式でもセルを指定することも可能です。

↑の記述は一般論で書いてもので
名前がブックレベルで定義したものならば
 
workbooks("ブック名").Names("範囲名").ReferstoRange
というようなコードになります。

回答
投稿日時: 23/07/05 07:28:31
投稿者: WinArrow

範囲名の1行目、1列目を除いて範囲を一括削除する方法
 

    With ActiveWorkbook
        With .Names("範囲名").RefersToRange
            .Intersect(.Cells, .Offset(1, 1)).ClearContents
        End With
    End With

 

回答
投稿日時: 23/07/05 09:43:22
投稿者: WinArrow

アドバイス
名前は「ブックレベル」または、「シートレベル」で定義することができます。
  
「ブックレベル」の定義では、ブックでユニークな名前にする必要がります。
「シートレベル」の定義では、ワークシートでユニークな名前にする必要がります。
  
ブックレベルの名前定義は
Range("XX")で参照することができるが、
私は、Workbooks("ブック名").Names("XX").ReferstoRnge
シートレベルは、Worksheets("シート名").Range("XX")
という形で使い分けています。
 
複数のワークシート(同一レイアウト)を処理する場合、
シートレベルの名前定義が便利です。

回答
投稿日時: 23/07/05 20:45:06
投稿者: simple

既に回答いただいています。付けたしで。

Sub test()
  'I列も同時に消して影響なければ、
  Debug.Print Range("XX").Offset(, 1).Address
    
  '影響があるなら
  Debug.Print Intersect(Range("XX"), Range("XX").Offset(, 1)).Address
    
  'Offsetを避けるなら
  Debug.Print Range("XX").Columns("B").Resize(, Range("XX").Columns.Count - 1).Address
End Sub
確認のためにAddressを表示しています。
OKならClearContentsメソッドを適用して下さい。
あとは、A列だけをどこかに退避しておき、全体を消去してから、A列だけ復旧させるとか。
 
----
質問に直接は関係しませんが、老婆心ながら。
 
基本的な話ですが、セル結合を使う必要性は何でしょうか。
セル幅を広くすれば済む話なら、セル結合を安易に使わないほうがいいですよ。
見出しだけだったり、
お役所かどこかに提出する最終の出力形態の部分で、
どうしてもセル結合が必要だということであれば止むを得ないのですが、
計算の途中段階であれば、処理が複雑化するだけで、セル結合のメリットは無いと思います。

投稿日時: 23/07/05 22:11:55
投稿者: TiTi

WinArrowさん、simpleさん、ありがとうございます。
どうもセル結合をしているとダメなようです。
「セル結合しているのできません」みたいなメッセージがでます。
セル結合を外したらいずれの場合もできました。
 
simpleさんの仰るようにアドレスは正しく取得できるのですが
Select、Acitivateは反応せず(選択状態にならず)、
ClearContentsでは、「セル結合しているのできません」みたいなメッセージがでます。
 
セル結合をしているは、この表(範囲XX)のデータを目視で確認しているからです。
データの組み合わせに違和感が無いかを確認しているのです。
どういう組み合わせが良くないのかは、多岐に渡っており、マクロ・条件付き書式などで判定させるのはしんどいと思っているのです。
また、例示ではワークシートの左上端に表範囲XX)がありますが、実際はワークシートの真ん中にあり(要するに上下左右が空いています)、上下には別のデータが入っています。
 
レイアウトを変えるのが面倒なので、現状で何とかしようとしている次第です。
 
で、結局、削除(データ消去)したい範囲に新たに名前(範囲YY)を付けて、
Range("範囲YY").ClearContents
として対処しました。これだと、セル結合していても削除(データ消去)できました。
 
WinArrowさん、このワークシートは別ブックにコピーして、貼り付け先のブックで範囲名を利用するので「シートレベルしています。
貼り付けたあとにシート名を変更しています。
そしてまた、このブック(先述の別ブック)にコピーすることを繰り返し、都度7ユニークなシート名にしています。
 
お二方、ありがとうございました。

回答
投稿日時: 23/07/05 23:26:07
投稿者: simple

Range("XX").Offset(, 1).ClearContents
は、少なくともI:J列も結合されていると確かにエラーになります。
(I列がセル結合の一部であるという説明はありませんでしたよね。)
 
しかし、他の二つはエラーになりますか?
 
後学のために、教えて下さい。
引用:
セル結合をしているは、この表(範囲XX)のデータを目視で確認しているからです。
データの組み合わせに違和感が無いかを確認しているのです。

もう少し詳細に説明してください、セル結合が必要な理由を。
目視で確認するとは、何を確認するんですか?
データの組み合わせとは?

回答
投稿日時: 23/07/05 23:47:13
投稿者: simple

例示されたものでは不要な気がしますが、
実際は結合セルがモザイク状になっているんですかね。
ひょっとしたら、その例示も実際とは違うのかもしれない。
D列〜F列が結合と言っても、各行で結合セルの状況が違うのかな。
 
後学のための質問は取り下げます。余り益が無いようが気がしてきました。
どうも失礼しました。
今後、正確な問題説明をお願いすることにして、私はこれで終わりとします。

回答
投稿日時: 23/07/06 07:13:01
投稿者: WinArrow

投稿日時: 23/07/05 07:28:31

WinArrow さんの引用:

範囲名の1行目、1列目を除いて範囲を一括削除する方法
 

    With ActiveWorkbook
        With .Names("範囲名").RefersToRange
            .Intersect(.Cells, .Offset(1, 1)).ClearContents
        End With
    End With

 

 
掲示したコードに間違いがありました。
>.Intersect
の先頭の「.」を消してください。

回答
投稿日時: 23/07/06 07:45:45
投稿者: WinArrow

引用:

どうもセル結合をしているとダメなようです。
「セル結合しているのできません」みたいなメッセージがでます。
セル結合を外したらいずれの場合もできました。

 
この状況、よくわかりません。
こちらで、下記を実行しても再現できません。
 
A2〜H6に名前:XXが設定されている状態で
    Range("XX").Offset(, 1).ClearContents
 
を実行→問題なく実行できましたが・・・・?
どこか、実際の設定と異なりますか?

回答
投稿日時: 23/07/06 10:10:44
投稿者: 半平太

.ClearContentsメソッドに拘り過ぎじゃないですか?
 
Rangeオブジェクトには、Valueプロパティもあります。
.Value = Empty
 
われら一般ユーザーは、エクセルの仕様を隅から隅まで知らされていない。

投稿日時: 23/07/06 22:35:42
投稿者: TiTi

実際のものに適用する際に、オフセット量をまちがえてました。どの場合も、問題なく実行できました。
ありがとうございました。
例では、左端の列が1列でしたが、実際のものは複数列をセル結合していました。オフセット量をそれに合わせると実行できました。
 
半平太さん、ClearContentsすると、セルはEmptyになるという理解で良いですか?
 
 

回答
投稿日時: 23/07/06 23:55:46
投稿者: 半平太

>半平太さん、ClearContentsすると、セルはEmptyになるという理解で良いですか?
 
ヘルプでは、「選択範囲から数式と文字を削除します。」との説明があります。
 
これは、セルのValueをEmptyにすることと同じと(私は)思います。
※他の見解があるかも知れないので、しばらくこのトピは閉じないでおいてください。
 
TiTiさんは、ClearContentsを使って、値をEmptyにする以外に何を期待していたんですか?
 
まさか「セル結合しているのできません」みたいなメッセージが見たかった訳じゃないですよね。
 
そのへんてこりんなエラーが出ると言うことは、全く同じでないことは明らかですが、
一般ユーザーにはその原因となる仕様の詳細なんて分かりっこないです。

回答
投稿日時: 23/07/07 07:39:32
投稿者: WinArrow

最初のレスの中で、
Offsetを使う場合は、注意が必要とかきましたが、
  
メソッドとプロパテイで、扱いが異なることを理解することです。
説明では、
 

引用:
A2:H6に範囲名XXを設定しています。
各行のB列〜C列、D列〜F列、G列〜H列を結合しています。

アドレス表示
オリジナル:$B$2:$H$6
OFFSET(,1):$C$2:$I$6
OFFSET(,2):$D$2:$J$6
  
OFFSET(,1)の場合は、範囲の先頭セルが、値が入っている先頭セルではありません。
Valueプロパテイでは、エラーにはなりませんが、メソッドでは、エラーになります。
  
>Offsetを使う場合は、注意が必要
何を注意するかといいますと、
「メソッドとプロパテイで、扱いが異なる」ということです。
 
もう一つ、
Valueプロパテイで「Empty」をセットする場合、
「結合セルの左上セルに「値」が入っている」ことから、
左上セル以外のセルに、「Empty」をセットしてもも、消去されません。
 

回答
投稿日時: 23/07/07 09:07:57
投稿者: 半平太

WinArrowさんのコメントは私の論旨に対する何かの反論なんですか?
 
私は、Offsetの話は何もしておりませんが。。
Offsetしたなら、した後のRangeオブジェクトの話ですけども。
 
>>Offsetを使う場合は、注意が必要
>何を注意するかといいますと、
>「メソッドとプロパテイで、扱いが異なる」ということです。
ここは何を言っているのか意味不明ですね、私には。
具体的に何メソッドと何プロパティなんですか?

回答
投稿日時: 23/07/07 15:40:06
投稿者: WinArrow

引用:

実際のものに適用する際に、オフセット量をまちがえてました。どの場合も、問題なく実行できました。

掲示したレイアウトと、実際のレイアウトが違っていたということ

適用する際に、オフセット量をまちがえてました。
ということで、終了と考えてよいのですか?
 
その直前に
Value = Empty
が提案がありました。
 
ClearcontentsメソッドとValue= Emptyは、Offsetのパラメータが同じならば、
当然のことながら、処理結果h同じになります。
しかし、Offsetのパラメータを間違ていた場合、
Clearcontentsメソッドはエラーになる可能性があり、
Value= Emptyは、エラーになりません。
エラーにならない・・・・意図した結果になっていないことを見逃してしまう可能性がある
・・・・いうことです。
 

回答
投稿日時: 23/07/07 18:09:22
投稿者: 半平太

>エラーにならない・・・・意図した結果になっていないことを見逃してしまう可能性がある
>・・・・いうことです。
 
だから何だって言うんですか?
 
間違った範囲を指定していたなら、それが問題なんです。
 
エラーにならないことは罪ではない。
取り違えないでくださいよ。

トピックに返信