Excel VBA質問箱 IV

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

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


7606 / 13645 ツリー ←次へ | 前へ→

【37924】エラー値を含むセルがあったら一定範囲削除 an 06/5/23(火) 16:06 質問[未読]
【37930】Re:エラー値を含むセルがあったら一定範囲... Statis 06/5/23(火) 16:37 回答[未読]
【37942】Re:エラー値を含むセルがあったら一定範囲... Mariko 06/5/23(火) 21:49 回答[未読]
【37943】Re:エラー値を含むセルがあったら一定範囲... an 06/5/23(火) 22:20 お礼[未読]
【37945】Re:エラー値を含むセルがあったら一定範囲... Mariko 06/5/23(火) 23:30 質問[未読]
【37948】Re:エラー値を含むセルがあったら一定範囲... Kein 06/5/23(火) 23:50 回答[未読]
【37950】Re:エラー値を含むセルがあったら一定範囲... Mariko 06/5/24(水) 6:28 お礼[未読]
【37968】Re:エラー値を含むセルがあったら一定範囲... Statis 06/5/24(水) 12:43 回答[未読]
【37969】Re:エラー値を含むセルがあったら一定範囲... Jaka 06/5/24(水) 12:56 発言[未読]
【37970】Re:エラー値を含むセルがあったら一定範囲... ichinose 06/5/24(水) 12:56 発言[未読]
【37973】Re:エラー値を含むセルがあったら一定範囲... Statis 06/5/24(水) 13:34 発言[未読]
【37994】Re:エラー値を含むセルがあったら一定範囲... Mariko 06/5/24(水) 18:14 お礼[未読]

【37924】エラー値を含むセルがあったら一定範囲削...
質問  an  - 06/5/23(火) 16:06 -

引用なし
パスワード
   こんにちは。
いつもこちらの掲示板には大変お世話になっております。

ある明細を発行するプログラムで、一部実行されない部分が
あり困っています。

VBAでvlookup関数を使ってユーザデータから名前をひろってきます。
ユーザデータに名前の無いデータは#N/Aと表示されるので、そのデータは
削除したいと思っています。(B列からM列までのデータすべて削除)

下記のようにコードを書くと、「型が一致しません」と表示され
てしまいます。


   For i = 10 To 40
   
     エラー値 = "#N/A"
    
     If Cells(m, 6).Value = エラー Then
       Range("B" & m & ":M" & m).ClearContents
          
     End If

    Next m

原因がお分かりになる方、教えていただけると大変助かります。

【37930】Re:エラー値を含むセルがあったら一定範...
回答  Statis  - 06/5/23(火) 16:37 -

引用なし
パスワード
   こんにちは
これで如何かな?

Sub Test()

Dim r As Range, Ch As Boolean
Ch = True
On Error GoTo ErrLen
Set r = Range("F10:F40").SpecialCells(xlCellTypeFormulas, 16)
Ch = False
r.Offset(, -4).Resize(, 12).ClearContents

ErrLen:
If Ch Then
  MsgBox "Errはありません。", vbInformation
End If
Set r = Nothing

End Sub


記載コードでは下記で如何かな?

For m = 10 To 40
  エラー値 = "#N/A"
  If Cells(m, 6).Text = エラー Then
    Range("B" & m & ":M" & m).ClearContents
  End If
Next m

【37942】Re:エラー値を含むセルがあったら一定範...
回答  Mariko  - 06/5/23(火) 21:49 -

引用なし
パスワード
   ▼an さん:

こんにちは。一度試してみてください。

下記のようにコードを書くと、「型が一致しません」と表示され
てしまいます。

   For i = 10 To 40   
     エラー値 = "#N/A"    
     If Cells(m, 6).Value = エラー Then
       Range("B" & m & ":M" & m).ClearContents          
     End If
    Next m
原因がお分かりになる方、教えていただけると大変助かります。

↓ ↓
変数を「i」に設定したらその変数を使います。(いつの間にかmに変わってしまっています)・・・「m」は何を指すのでしょう?ここが問題になっています。

後は問題なさそうです。
私なりに貴方のコードを使って書いてみました。これでいけると思います。
お試しみてください。


Sub 削除()  'VLookUpで#N/Aが発生したらその行の8列削除
 Dim i as Integer 'この行は無くても動きますが
 For i = 10 To 40
  On Error Resume Next  
     エラー値 = "#N/A"
     If Cells(i, 6).Value = エラー値 Then
       Range("B" & i & ":M" & i).ClearContents     
     End If
    Next i
  On Error GoTo 0
End Sub

【37943】Re:エラー値を含むセルがあったら一定範...
お礼  an  - 06/5/23(火) 22:20 -

引用なし
パスワード
   ▼Statis さん:
ありがとうございました!

.Valueではなく.Textなんですね。
大変勉強になりました。

>Sub Test()

↑こちらの方は、何故か結果が
思っているものと違って表示されました。

Booleanなど、使ったことがない型などが
あり、全体的に私にとって難しいので、
これから勉強し理解するように努めます。

また、初心者で聞くのが恥ずかしいのですが
一時の恥と思い思い切ってお伺いします。
Setは何のために使うのでしょうか?
r = Range("F10:F40").SpecialCells(xlCellTypeFormulas, 16)
としてはいけないのですか?

【37945】Re:エラー値を含むセルがあったら一定範...
質問  Mariko  - 06/5/23(火) 23:30 -

引用なし
パスワード
   ▼Statis さん:

横からお邪魔しましてごめんなさい。
素晴らしいコードを見させていただきました。
でも、実際にコードを動かすと、反応かありません。

SpecialCellsの#N/A番号は16でした?ですか。
あるいは、私が何か勘違いで、上手く出来ていないのかも知れませんが。
 ↓
r = Range("F10:F40").SpecialCells(xlCellTypeFormulas, 16)

【37948】Re:エラー値を含むセルがあったら一定範...
回答  Kein  - 06/5/23(火) 23:50 -

引用なし
パスワード
   これでやってみて下さい。

Sub Test2()
  Dim MyR As Range

  On Error GoTo ELine
  Set MyR = Range("F10:F40").SpecialCells(3, 16)
  On Error GoTo 0
  Intersect(MyR.EntireRow, Range("B:M")).ClearContents
  Set MyR = Nothing: Exit Sub
ELine:
  MsgBox "エラーのセルはありません", 64
End Sub

【37950】Re:エラー値を含むセルがあったら一定範...
お礼  Mariko  - 06/5/24(水) 6:28 -

引用なし
パスワード
   ▼Kein さん:

おはよう御座います。
早朝から素晴らしいコードを拝見させていただき喜んでおります。
Intersectの使い方の勉強になりました。

少しお聞きしたいのですが・・・
Statisさんのコードを実行しましたが、
r.Offset(, -4).Resize(, 12).ClearContents 
の行でトラぶっている事が分かりました。Resize(,12).を外すとB列が正しく
削除されます。
Resizeの使い方は合っていると思うのですが、如何でしょう。

Sub Test()

Dim r As Range, Ch As Boolean
Ch = True
On Error GoTo ErrLen
Set r = Range("F10:F40").SpecialCells(xlCellTypeFormulas, 16)
Ch = False
r.Offset(, -4).Resize(, 12).ClearContents 
ErrLen:
If Ch Then
  MsgBox "Errはありません。", vbInformation
End If
Set r = Nothing

End Sub

【37968】Re:エラー値を含むセルがあったら一定範...
回答  Statis  - 06/5/24(水) 12:43 -

引用なし
パスワード
   こんにちは

これで如何かな?
>r.Offset(, -4).Resize(, 12).ClearContents
Set r = r.Offset(, -4)
r.Resize(, 12).ClearContents

【37969】Re:エラー値を含むセルがあったら一定範...
発言  Jaka  - 06/5/24(水) 12:56 -

引用なし
パスワード
   >>r.Offset(, -4).Resize(, 12).ClearContents
>Set r = r.Offset(, -4)
>r.Resize(, 12).ClearContents
飛び飛びセルの場合、ループしないと最初のセル以外は、Resize出来ないと思いますけど。

【37970】Re:エラー値を含むセルがあったら一定範...
発言  ichinose  - 06/5/24(水) 12:56 -

引用なし
パスワード
   皆さん、こんにちは。


>これで如何かな?
>>r.Offset(, -4).Resize(, 12).ClearContents
>Set r = r.Offset(, -4)
>r.Resize(, 12).ClearContents

これ、たぶん・・・。
Specialcellsメソッドで取得できるセル範囲って、
常に連続したセル範囲(隣接しているセルのブロック)であるとは限りませんよね!!

オブジェクトでいうとArea単位でしかResizeは行えないのでないですか?

よって、Specialcellsで取得したセル範囲をArea単位でループさせて
Resizeするしかないと思います。

For each carea in Specialcellsメソッドで取得したセル範囲.areas
  carea.resize(,12).ClearContents
  next

よって、KeinさんのIntersectが簡単なコードでよいなあと思いますけどねえ!!

確認してみてください。

【37973】Re:エラー値を含むセルがあったら一定範...
発言  Statis  - 06/5/24(水) 13:34 -

引用なし
パスワード
   こんにちは
またもやうっかりミスをしてしまいした。

こちらのテスト環境のやり方がまずかったです(連続させてErr値を作っていました)

そうですよね、飛び飛びの場合が通常ですよね

お二人様のおかげで助かりました。(感謝)

【37994】Re:エラー値を含むセルがあったら一定範...
お礼  Mariko  - 06/5/24(水) 18:14 -

引用なし
パスワード
   今晩は。

大変貴重な体験が出来、感謝しています。
Resiseは不連続のセルを拾うことが出来ないのですね。
また、SpecialCellsをヘルプで調べても、数字でその特性を規定する内容が出てきませんが、ヘルプで調べられるのでしょうか。
ワークシートでF5を叩き何となくSpecialCellのナンバーを推測しているのですが・・・
Intersectの使い方の理解もさせていただきました。
いざ、使うと上手に使えないと思いますが、勉強させていただきました。
今後ともよろしくご指導の程お願いたします。

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