Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4764 / 13646 ツリー ←次へ | 前へ→

【54604】列の削除 名無し 08/3/23(日) 21:58 質問[未読]
【54611】Re:列の削除 VBWASURETA 08/3/24(月) 10:55 発言[未読]
【54616】Re:列の削除 VBWASURETA 08/3/24(月) 11:53 発言[未読]
【54614】Re:列の削除 ひげくま 08/3/24(月) 11:06 発言[未読]

【54604】列の削除
質問  名無し  - 08/3/23(日) 21:58 -

引用なし
パスワード
   皆様お世話になります。
以前に【54114】Re:列の削除について  
にて

 Dim intCol As Integer
 Dim FR As Range
 Dim rngDel As Range

 For intCol = 1 To Columns.Count
  On Error Resume Next
  Set FR = Columns(intCol).Cells.Find("*", , xlValues, xlPart)
  On Error GoTo 0
  If FR Is Nothing Then
   If rngDel Is Nothing Then
    Set rngDel = Columns(intCol)
   Else
    Set rngDel = Union(rngDel, Columns(intCol))
   End If
  End If
  Set FR = Nothing
 Next
   
  If Not rngDel Is Nothing Then
    rngDel.EntireColumn.Delete Shift:=xlToLeft
    Set rngDel = Nothing
  End If

の意味もわからず自分のしたいことができたのですが
Set FR = Columns(intCol).Cells.Find("*", , xlValues, xlPart)
の部分で"*"のところで2つ以上の文字をいれて実行したいのですが
どうすればよいのでしょうか。
例えば "山" "谷" "川"の文字のある列を残して他の列を削除したいのですが
"*" を "山,谷,川" として実行してみたら全部削除されてしましました。

【54611】Re:列の削除
発言  VBWASURETA  - 08/3/24(月) 10:55 -

引用なし
パスワード
   おはようございます。

この条件だと消されます。
簡単に解析してみますが、それ以降はFindメソッドで調べてやってみて下さい。
もう少し調べるようにしないと丸投げになりレスが付きにくくなりますから。


> Dim intCol As Integer
> Dim FR As Range
> Dim rngDel As Range
>
> For intCol = 1 To Columns.Count
>  On Error Resume Next
>  Set FR = Columns(intCol).Cells.Find("山,谷,川", , xlValues, xlPart)
>  On Error GoTo 0
>  If FR Is Nothing Then
>   If rngDel Is Nothing Then
>    Set rngDel = Columns(intCol)
>   Else
>    Set rngDel = Union(rngDel, Columns(intCol))
>   End If
>  End If
>  Set FR = Nothing
> Next
>   
>  If Not rngDel Is Nothing Then
>    rngDel.EntireColumn.Delete Shift:=xlToLeft
>    Set rngDel = Nothing
>  End If

で、というソースコードですよね?
因みにシート上でCTRL+Fキーを押して出てきたダイアログの
検索する文字列のテキストに同じ条件の「山,谷,川」入れてみて下さい。

その部分が

>  Set FR = Columns(intCol).Cells.Find("山,谷,川", , xlValues, xlPart)

に相当します。
因みにこの場合は1列全体選択でやってますね。

次に以下の条件のところですが

>  If FR Is Nothing Then

検索で見つからなかった場合に入る条件です。
上記のソースだと"山,谷,川"の文字列がない場合に入ります。
因みに「*」はワイルドカード文字なので入力されているものが
あればこの条件に入らないことになります。

次に問題の条件ですが

>   If rngDel Is Nothing Then

rngDelの定義はあるものの実体(Set部分)がありませんよね?
なので常にNothing状態なので必ず条件内へ入ります。


以上で、簡単な解析になりますが、何故消えるかわかりましたか?

【54614】Re:列の削除
発言  ひげくま  - 08/3/24(月) 11:06 -

引用なし
パスワード
   ここは、「マクロを作ってもらうところ」ではなく、「マクロを教えてもらうところ」だと、私は認識しています。

作ってもらったものを理解もせずに使って、不都合が生じたら、また作ってもらおう、というのはどうかと思いますよ。

せっかく作ってもらったのですから、理解しようと努力しましょうよ。

【54616】Re:列の削除
発言  VBWASURETA  - 08/3/24(月) 11:53 -

引用なし
パスワード
   すみません1点訂正です。

>   If rngDel Is Nothing Then

ですが常にNothingではないですね。
1列選択して次のループで列削除してます。

一度、さっき記載しましたCTRL+Fキー検索で
試してどいう動きをするかみてください。

後、条件ですがOr条件にしたいということでしょうか?
あまり書くのも調べるのにあれですが、
Findメソッドの場合は1条件のみです。
ということは複数回ループする条件にしないとだめですよ。

4764 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free