Excel VBA質問箱 IV

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

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


10437 / 13644 ツリー ←次へ | 前へ→

【21818】同じ項目行中の特定の数字を消去するには? ギン 05/1/31(月) 17:01 質問[未読]
【21820】Re:同じ項目行中の特定の数字を消去するに... ichinose 05/1/31(月) 18:17 発言[未読]
【21825】Re:同じ項目行中の特定の数字を消去するに... ギン 05/2/1(火) 11:24 質問[未読]
【21837】Re:同じ項目行中の特定の数字を消去するに... Jaka 05/2/1(火) 16:06 発言[未読]
【21841】Re:同じ項目行中の特定の数字を消去するに... ギン 05/2/1(火) 19:11 お礼[未読]
【21844】Re:同じ項目行中の特定の数字を消去するに... ichinose 05/2/1(火) 20:29 発言[未読]
【21849】Re:同じ項目行中の特定の数字を消去するに... Jaka 05/2/2(水) 9:32 発言[未読]

【21818】同じ項目行中の特定の数字を消去するには...
質問  ギン  - 05/1/31(月) 17:01 -

引用なし
パスワード
   いつもお世話になっております。
どなたかお教え下さいませ。
ワークシートAの中に削除したい品名と数があります
ワークシートA
列A   列B
品名A  200
品名B  150
品名C  350
ワークシートBの中には同一品名で数が数パターンあります
(ワークシートと同一品名で同一数のものは必ずあります)
ワークシートB
列A   列B
品名A  20
品名A  200←
品名A  150
品名B  150←
品名B  25
品名C  350←
品名C  34
ワークシートAの品名と同じ数をワークシートBから探しだし(←の行)
行削除したいのですが途中までで解らなくなってしまいました。
申し訳ありませんがよい知恵をお貸しください。

【21820】Re:同じ項目行中の特定の数字を消去する...
発言  ichinose  - 05/1/31(月) 18:17 -

引用なし
パスワード
   ▼ギン さん:
こんばんは。


>いつもお世話になっております。
>どなたかお教え下さいませ。
>ワークシートAの中に削除したい品名と数があります
>ワークシートA
>列A   列B
>品名A  200
>品名B  150
>品名C  350
↑このシートのシート名を「A」とします。

>ワークシートBの中には同一品名で数が数パターンあります
>(ワークシートと同一品名で同一数のものは必ずあります)
>ワークシートB
>列A   列B
>品名A  20
>品名A  200←
>品名A  150
>品名B  150←
>品名B  25
>品名C  350←
>品名C  34
↑このシートのシート名を「B」とします。

例題どおり、この「A」も「B」の1行目からデータが入っているとしましょう。
以下のコードは、シート「B」のC列を作業列として、使用しています。
作業列をどの列でも良いですが、その場合、コード中の数式も変更が必要です。
'=================================================================
Sub main()
  Dim rnga As Range
  Dim rngb As Range
  Dim Aadd As String
  Dim Badd As String
  With Worksheets("A")
   Set rnga = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
   Aadd = rnga.Address(, , xlR1C1, True)
   Badd = rnga.Offset(0, 1).Address(, , xlR1C1, True)
   End With
  '↑シート「A」のデータ範囲の取得
  With Worksheets("B")
   Set rngb = .Range(.Cells(1, 1), .Cells(.Rows.Count, 1).End(xlUp))
   End With
  ' ↑シート「B」のデータ範囲の取得

  With rngb
   .Offset(0, 2).Formula = "=IF(SUMPRODUCT((" & Aadd & "=rc[-2])*(" & _
         Badd & "=rc[-1]))=1,true,"""")"
   '↑シート「A」のリストデータと等しいものがあれば、「True」をセット
   On Error Resume Next
   Set ans = .Resize(, 3).SpecialCells(xlCellTypeFormulas, xlLogical)
   'C列から削除セルを取得
   .Offset(0, 2).ClearContents
   If Err.Number = 0 Then ans.EntireRow.Delete
'               削除処理
   On Error GoTo 0
   End With
End Sub


手動操作をマクロにしただけですが・・・・。
確認してみて下さい。

【21825】Re:同じ項目行中の特定の数字を消去する...
質問  ギン  - 05/2/1(火) 11:24 -

引用なし
パスワード
   ichinose さん
解答有難う御座います
早速自分のワークシートに当てはめてみたところ
指定行を削除することが出来ました。
とても嬉しいです!!
後学の為に二つ程お教え頂きたいのですが

>   Set ans = .Resize(, 3).SpecialCells(xlCellTypeFormulas, xlLogical)
>   'C列から削除セルを取得
>   .Offset(0, 2).ClearContents
>   If Err.Number = 0 Then ans.EntireRow.Delete
>'               削除処理
>   On Error GoTo 0
上記の部分でなぜ行が削除されるのか
もう少し詳しく教えて下さいませ。
処理が出来たのですか何故なのか解らないままです。
重ね重ね申し訳ありません。

【21837】Re:同じ項目行中の特定の数字を消去する...
発言  Jaka  - 05/2/1(火) 16:06 -

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

こんな感じにして、F8ステップモードで1行1行確認してみるとわかるとお見ます。

  With rngb
   .Offset(0, 2).Select  '←これ追加
   .Offset(0, 2).Formula = "=IF(SUMPRODUCT((" & Aadd & "=rc[-2])*(" & _
         Badd & "=rc[-1]))=1,true,"""")"

   On Error Resume Next
   Set ans = .Resize(, 3).SpecialCells(xlCellTypeFormulas, xlLogical)
   ans.Select  '←これ追加
   .Offset(0, 2).Select  '←これ追加
   .Offset(0, 2).ClearContents
   If Err.Number = 0 Then
    ans.EntireRow.Select  '←IF文改行して、これ追加
    ans.EntireRow.Delete
   End If
   On Error GoTo 0
   End With


ichinoseさんへ

  sushiki = "=if(iserror(FIND(""ED""," & myadd & "))," & _
        "if(" & myadd & "="""",""""," & myadd & ")," & _
        "MID(" & myadd & ",FIND(""ED""," & myadd & "),LEN(" & myadd & ")))"
  Debug.Print sushiki '数式を確認して下さい
  rng.Value = Evaluate(sushiki)

う〜ん、さすがと言うか、こういうセル範囲でのEvaluateと、セル範囲での関数は全く思いつかなかったです。
勉強になりました。
今度からこれ使おうっと...。
どうも、ありがとうございました。
でも、SpecialCellsで、飛び飛びになった場合はやっぱしダメでしたね。

【21841】Re:同じ項目行中の特定の数字を消去する...
お礼  ギン  - 05/2/1(火) 19:11 -

引用なし
パスワード
   ichinoseさん
JAKAさん
やっと理解する事が出来ました。

こんなふうに関数を使う方法があるんんですね!
さらにtrueのCellを格納する方法も勉強になりました
今度から使ってみます。。

有難う御座いました。
では、失礼致します。

【21844】Re:同じ項目行中の特定の数字を消去する...
発言  ichinose  - 05/2/1(火) 20:29 -

引用なし
パスワード
   Jaka さん、ギンさん、こんばんは。
Jaka さんのフォローで解決したみたいなので何よりです。
投稿したので、ちょっとだけ付けたし。

>  With rngb
>   .Offset(0, 2).Select  '←これ追加
>   .Offset(0, 2).Formula = "=IF(SUMPRODUCT((" & Aadd & "=rc[-2])*(" & _
>         Badd & "=rc[-1]))=1,true,"""")"
>
>   On Error Resume Next
>   Set ans = .Resize(, 3).SpecialCells(xlCellTypeFormulas, xlLogical)
>   ans.Select  '←これ追加
>   .Offset(0, 2).Select  '←これ追加
>   .Offset(0, 2).ClearContents
>   If Err.Number = 0 Then
>    ans.EntireRow.Select  '←IF文改行して、これ追加
>    ans.EntireRow.Delete
'      ↑これで削除しているのですが、
'       データ数(シートBの)が1000行ぐらいなら
'       まあ、我慢できますが、
'       7000行ぐらいになるとコード1行で済むのですが、
'       処理は遅くなってしまい我慢できませんでした。
'       データ数が多いときは、削除も分割して行った方がよいかも・・。
'       Jakaさんが目安箱で検証しているので参考にして下さい。
http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=54;id=FAQ       
'
>   End If
>   On Error GoTo 0
>   End With


Jakaさん、絡むのは久しぶりですねえ!!
>
>  sushiki = "=if(iserror(FIND(""ED""," & myadd & "))," & _
>        "if(" & myadd & "="""",""""," & myadd & ")," & _
>        "MID(" & myadd & ",FIND(""ED""," & myadd & "),LEN(" & myadd & ")))"
>  Debug.Print sushiki '数式を確認して下さい
>  rng.Value = Evaluate(sushiki)
>
>う〜ん、さすがと言うか、こういうセル範囲でのEvaluateと、セル範囲での関数は全く思いつかなかったです。
>勉強になりました。
>今度からこれ使おうっと...。
>どうも、ありがとうございました。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=21819;id=excel

↑このご質問ですね!!
あれっ・・・、Evaluateで配列数式が扱えると言う事を教えてくれたのは
Jakaさんだよ!!(私への直接の回答ではなかったけど 
これは、間違いない、私、よく覚えています)

教えてもらってからなんです。Evaluateを多用し始めたのは・・・。

便利なんですが、Evaluateメソッドに「配列数式だよ」って、認識させるには
工夫が必要みたいです。
つまり、セルに直接入力可能な配列数式が全部Evaluateでも配列として認識するとは
限らないみたいですよ!!
これは、仕方がないとは思いますが・・・。

【21849】Re:同じ項目行中の特定の数字を消去する...
発言  Jaka  - 05/2/2(水) 9:32 -

引用なし
パスワード
   質問の本スレッドと全く関係ありませんけど...。

>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=21819;id=excel
>
>↑このご質問ですね!!
>あれっ・・・、Evaluateで配列数式が扱えると言う事を教えてくれたのは
>Jakaさんだよ!!(私への直接の回答ではなかったけど 
>これは、間違いない、私、よく覚えています)
えっ!って最初思ったけど....。
そっか、配列関数みたいなSUMPRODUCTで書いた事はあるけど....。
これを応用されたのですね?

SUMPRODUCTは、関数欄に載っているので使えたりしますが、独自に配列関数使うと言った発想が全くありませんでした。
今だに配列関数はよく解りませんが、ichinoseさんの書かれた物を形で覚えたいと思います。
きっかけがどうであれ、私には思いつくはずもない事ですので、
「勉強になりました。
 ありがとうございました。」としか....。

私だと、関数ぶち込んで .Vlue = .Vlue でしたね.....。

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