[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAでのIF文の方法』(あなたが居たから)
VBAでのIF文の方法について教えて下さい
ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
フィルタで検索をして該当があれば下記を実行
Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete ActiveSheet.ShowAllData
該当がなければ何もしない、その様にするにはどうしたらいいのでしょうか?
宜しくお願いします。
< 使用 Excel:Microsoft365、使用 OS:Windows11 >
(匿名) 2024/01/09(火) 11:15:58
Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete ActiveSheet.ShowAllData これは、純粋に削除する為にしています。
そこは別になんでも良いのですが
A1セルに値を入れるでもいいですし
IF文で
ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues を実行した場合を知りたいのですが… (あなたが居たから) 2024/01/09(火) 12:02:16
(もこな2 ) 2024/01/09(火) 12:25:45
(もこな2 ) 2024/01/09(火) 12:27:01
と記載があったので、
>ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
でフィルタを実行して、"EA", "EC", "SB"がある場合、行削除を実行、"EA", "EC", "SB"がない場合は何もしない。
という事をやりたいのかと思いました。
>これは、純粋に削除する為にしています。
削除しているのは、
「Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete」
の行だけですよ。
>IF文で
> ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
>を実行した場合を知りたいのですが…
IF文でフィルタを実行するとは、何かの条件があった時だけフィルタを実行するという事でしょうか?
(匿名) 2024/01/09(火) 12:28:30
>該当がなければ何もしない、その様にするにはどうしたらいいのでしょうか?
該当する行が無ければ...
↓多分だけど この子が怒ってエラーになると思うけど SpecialCells(xlCellTypeVisible)...仕事できんけど (`⌒´メ) ムカ
なので On Error Resume Nextして、エラー回避の処理しておくとか? すれば IF文は必要ないような気がしますが、勘違いしてたらすいません。
Sub Sample() Dim rng As Range On Error Resume Next With Range("A1").CurrentRegion .AutoFilter '一旦解除 .AutoFilter field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Set rng = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) rng.Delete shift:=xlUp ' 絞込行を削除 End With If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData '解除 End If End Sub (あみな) 2024/01/09(火) 13:26:49
シートレイアウトの説明がないので、 タイトル行があるのか無いのか、 タイトル行が1行目なのか2行目なのか回答者には判断がつきません。
1例として、タイトル行が1行目で2行目からデータ行とすると、
Lrow = Range("A" & Rows.Count).End(xlUp).Row のした後のLrowの値は、 ・該当行がないとき Lrow=1 ・該当行があるとき Lrow>1 なので、Lrowの値で条件分岐できるでしょう 一方で、冒頭で書いたとおり、 タイトル行があるのか無いのか、タイトル行が1行目なのか2行目なのかによって、 条件が変わるので、実際の環境でLrowの値がどうなるのかは、自分で確かめてください ということを (匿名)さん 2024/01/09(火) 11:15:58 は書いています。
>該当する行が無ければ... >↓多分だけど この子が怒ってエラーになると思うけど >SpecialCells(xlCellTypeVisible) 行目がタイトル行で、該当データが無いとき、Lrow=1になって Range("A2:A1").SpecialCells(xlCellTypeVisible) はタイトル行になって、 タイトル行を削除して正常終了するんじゃないですか?
なので、あみなさんのコードの様にするのがいいと思います。
ちなみに、まったくの余談ですが、 Set rng = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible) は Set rng = .Resize(.Rows.Count - 1).Offset(1, 0) の方がより安心という話を遠い昔に教えてもらいました。 先にOffsetすると範囲をはみ出すから、先に範囲を小さくしてからOffsetしなさいと習いました。 いや、ないだろ... と思いながら聞いてましたが、その後一応気にはするようにしています (´・ω・`) 2024/01/09(火) 13:57:54
・ω・ s いつも、ありがとうございます。
>の方がより安心という話を遠い昔に教えてもらいました。 ちょっと調べて学習して来ます。 (あみな) 2024/01/09(火) 14:04:32
■1
>タイトル行があるのか無いのか、タイトル行が1行目なのか2行目なのか
よっぽどのこと(変なセル結合とか)がなければ、↓だと1行目が項目行になると思います。
ActiveSheet.Range("A1").AutoFilter 〜〜〜
■2
「SpecialCells(xlCellTypeVisible)」の使用にこだわりがあるのかもしれませんが、既に述べたように使わずとも解決できます(後述)
■3
ActiveSheet.Range("A1").CurrentRegion.AutoFilter '一旦解除
↑のようなアドバイスがありますが、「(ワークシートシートオブジェクトの)AutoFilterMode」をFalseにする方法もあります。
■4
ということを踏まえると↓のようにしてもよいと思います。
Sub 研究用() With ActiveSheet .AutoFilterMode = False .Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues If .Cells(.Rows.Count, 8).End(xlUp).Row > 1 Then 'H列の最終行を確認して項目行より大きいか判断する Stop .AutoFilter.Range.Offset(1).EntireRow.Delete .ShowAllData End If End With End Sub
※1 説明用の提示であり完成品プレゼントの意図はありません。 ※2 採用される場合はステップ実行等により研究のうえ必要な部分のみご自身のコードに組み込んでください。 ※3 直してしまいましたが、対象のオブジェクトはきちんと明示(修飾)されたほうがよいとおもいます。
(もこな2 ) 2024/01/09(火) 19:17:20
トピ主さんの反応がありません。。。 あっ。。。もこな先生が何か「おっしゃって」います。
重箱って、開けたら髪の毛が真っ白になる...あれですよね? 竜宮城で...貰えるやつって、お話ですね?...わかりました。
>※1 説明用の提示であり完成品プレゼントの意図はありません。 なるほど。。。これは何処かに...もしかして? 罠があるってことですね?
では、さっそく重箱の中身の( 研究用 )マクロを実行して お勉強をさせていただこうと思います。楽しみです。
オートフィルターを掛ける表なので、一般的に 1行目には、見出しがあるものとします。
>Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete トピ主さんも、上記のように指定しているので、間違いないでしょう。
◆表1 : 初期状態とする( データ範囲は5行 )
|[H] [1]|H列(項目) [2]|EA ←削除 [3]|EC ←削除 [4]|SS [5]|SB ←削除 [6]|SS
◆表2 : [ 研究用 ]マクロ実行後…無事に対象の行を削除できました。
|[H] [1]|H列(項目) [2]|SS [3]|SS
でも、もう1回 [ 研究用 ]のマクロを実行すると、SSのある行がなくなります。 ・゚・データ範囲が(´PД・q)消えたぁ消えたぁ・゚・戻ってこないよーな???
削除対象の行が「1行」でもあれば、If 略 > 1 Then を通過できます。 2行しかないデータ範囲で、見れば解るのに誰もマクロを実行して 不要な行を消そうとはしないのが普通ですが、1万行とした場合 に削除対象の行があるかどうかは解りません。罠だぁ…鶴に変身
どのように考えたら良いでしょうか?自分で考えろって事ですね。 竜宮城に戻ります... (あみな) 2024/01/10(水) 10:56:43
・ω・ s に宿題を貰ったから、調べました。 下の書き方で、どちらが多用されているかです。
With Range("A1").CurrentRegion Set rng = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)...[ 書き方 1 ]とする Set rng = .Resize(.Rows.Count - 1).Offset(1, 0).SpecialCells(xlCellTypeVisible)...[ 書き方 2 ]とする End With
と言っても、3時間掛けて調べることもできないので 15分程度ですが、検索でぐぐるキーは下記としました。
[ Autofilter 行削除 ]
して、その結果はと言いますと、書き方はほぼ「半々」 で「 いずれも引けを取らない 」ってかんじでした。
(●TωT。)ゥゥ・どうしよう...どっちが安全か? 気になる URL先を覗いてみることにします
※絞り込んだ結果の行を操作する: Office TANAKA http://officetanaka.net/excel/vba/tips/tips155d.htm
※VBA100本ノック 10本目:行の削除 : エクセルの神髄 https://excel-ubara.com/vba100/VBA100_010.html
さて、閲覧された方はどちら派でしょうか?
・ω・ sは、 [ 書き方 2 ]を推奨する方向で、お願いします。 私はしばらく、[ 書き方 1 ]で頑張ります。でも両方使用しちゃうかもです...(笑) (あみな) 2024/01/10(水) 11:01:14
余談の方に強い反発を受けてますが、実践的にはどっちでもいいですよ ただ、想定としてこういう可能性も0ではないということです
Sub test1() Columns("A").Value = 1 With Range("A1").CurrentRegion .Offset(1).Resize(.Rows.Count - 1).ClearContents 'エラー アプリケーション定義またはオブジェクト定義のエラーです。 End With End Sub Sub test2() Columns("A").Value = 1 With Range("A1").CurrentRegion .Resize(.Rows.Count - 1).Offset(1).ClearContents ' エラーにならない End With End Sub (´・ω・`) 2024/01/10(水) 11:12:07
こっちが本題 > でも、もう1回 [ 研究用 ]のマクロを実行すると、SSのある行がなくなります 再現しません。ホントに消えますか? (´・ω・`) 2024/01/10(水) 11:13:11
消えるというか、隠れますです。 表現が間違いました。 (あみな) 2024/01/10(水) 11:15:08
承知しました .ShowAllData はIFブロックの外に出した方がいいということですね (´・ω・`) 2024/01/10(水) 11:22:17
書き方が、まだ他にもいっぱいあるので スキルが足りないので、私にはベスト案は解りません^^;
別件
Columns("A").Value = 1 この想定は考えていませんでした。なるほど...
Sub test1()だと確かに
'エラー アプリケーション定義またはオブジェクト定義のエラーです。 になりますね。 (あみな) 2024/01/10(水) 11:28:57
あみなさん 現実的にシートの最終行までデータが埋まっているなんであり得なし、 もしそういう想定なら、Cells(Rows.Count,"A").End(xlUP) とか使えなくて、 もっと考えないといけない事がありすぎるので、無駄な想定です。
ちょっと余談がすぎました すみません (´・ω・`) 2024/01/10(水) 12:12:41
・ω・ s 全く問題ないですよ。
>余談の方に強い反発を受けてますが、実践的にはどっちでもいいですよ
私は、反発してるつもりもありません。 楽しくお勉強をさせていただいています。 いつもここの大先輩方のマクロを動かして遊んでいます。 ※test1 の想定も、最終行の理解のお勉強です。 (あみな) 2024/01/10(水) 12:25:38
■5
>.ShowAllData はIFブロックの外に出した方がいいということですね
確かに抽出しっぱなしになっちゃいますね。ご指摘ありがとうございます。
ただ、データ行のすべてが削除対象だったときに「ShowAllData」が失敗するので、削除対象の有無にかかわらず無条件でオートフィルタを解除する方が安牌だったかもしれません。
■6
↓って【A列の最大行までデータが入っている】ので、Offset(1)できないからエラーになるって話ですよね?
.Offset(1).Resize(.Rows.Count - 1).ClearContents 'エラー アプリケーション定義またはオブジェクト定義のエラーです。 .Resize(.Rows.Count - 1).Offset(1).ClearContents ' エラーにならない
逆に、後者は【Range("A1").CurrentRegionで得られるセル範囲が1行しかない】場合、Resize(0)ができないから同様のエラーになりませんか?
(オートフィルタを設定しようとしているセル範囲が項目行しかないなんてこともまた、現実的ではないでしょうが。)
■7
Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
↑は「Lrow」が2の時に↓のように解釈されるのでマズイとおもいます。
Range("A2").SpecialCells(xlCellTypeVisible).EntireRow.Delete ※単一セルを対象にSpecialCellsを実行すると、全セル?を対象にしたと解釈される仕様(バグ?)のため。
また、↓だと(アクティブシートの)A列の状態によっては「Lrow」が1になることがあり得ます。
Lrow = Range("A" & Rows.Count).End(xlUp).Row
そうすると、↓のよう解釈されることになり、項目行たる1行目が削除対象になるので、やはりマズイと思います。
Range("A1:A2").SpecialCells(xlCellTypeVisible).EntireRow.Delete
(もこな2 ) 2024/01/10(水) 13:21:33
余談については終了したいところですが、 ■6について >逆に、後者は【Range("A1").CurrentRegionで得られるセル範囲が1行しかない】場合、Resize(0)ができないから同様のエラーになりませんか? OffsetとResizeの順序の話をしてました Resize(0)は別の話で、前者も後者も同じ問題を抱えています .Rows.Countで分岐すべきですね (´・ω・`) 2024/01/10(水) 13:51:15
>色々とありがとうございます。
>ちょっと試してみます。
>少し時間を下さい
>追いつかない(-_-;)
とありますが、2行追加すればよいだけでは?
最初の質問が曖昧のままではありますが、
>フィルタで検索をして該当があれば下記を実行
>該当がなければ何もしない、その様にするにはどうしたらいいのでしょうか?
この文面の通りと仮定して話します。
以下の通りにテスト環境を作成し、
サンプルコードをステップイン実行してみて下さい。
#テスト環境作成#
新規Bookを開きます。
A1セルに「Title1」、A2セルに「Title2」と入力します。
A2セルからA11セルに、数値の「1」から数値の「10」までの連続データを入力します。
B2セルからB11セルに、適当な文字(「a」「b」「c」…)などを入力します。
B2セルからB11セルのどこかに、ランダムに「EA」「EC」「SB」という文字を入力します。
#サンプルコード#
Sub Sample()
ActiveSheet.Range("A1").AutoFilter Field:=2, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row If Lrow > 1 Then Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ActiveSheet.ShowAllData
End Sub
#変更点#
If Lrow > 1 Then
End If
の2行を追加しただけ
#解説#
私の最初の回答は、
変数「Lrow」の値によって、該当データが存在するかしないかを判断できるので、
以下の様に回答したのです。
>該当がない場合、
>変数「Lrow」には、どんな値が入るか
>該当がある場合、
>変数「Lrow」には、どんな値が入るか
>をステップイン実行で確認してみて下さい。
この通りやってみましたか?
VBAのコードを1行ずつ解説します。
>ActiveSheet.Range("A1").AutoFilter Field:=2, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
この行は、
A1セルにカーソルを合わせた状態にして、
データタブのフィルタボタンを押して、
2列目の値が、"EA"又は、"EC"又は"SB"のみにチェックを入れてOKボタンを押しなさい
という命令を実行しています。
>Dim Lrow As Long
この行は、
「Lrow」という変数をLong型で使用する宣言をしなさい
という命令を実行しています。
>Lrow = Range("A" & Rows.Count).End(xlUp).Row
この行は、
A列の最終行から上に1セルずつ見て、
セルに何かの値が入力された行まで行き、
その行数を、変数「Lrow」に代入しなさい
という命令(シートの最終行にカーソルを置いてCtrl+↑)を実行しています。
>Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
この行は、
A2セルから、A列のデータある最終号までの中で、
表示されている行を削除しなさい
という命令を実行しています。
従って、"EA", "EC", "SB"が入っている行が1つもない場合、
変数「Lrow」の値が「1」になるはずです。
"EA", "EC", "SB"が入っている行が1つでもある場合、
変数「Lrow」の値が「1」より大きくなるはずです。
私の回答通りにステップイン実行した結果を再質問していれば、
>???
>どういう意味ですか?
> Dim Lrow As Long
> Lrow = Range("A" & Rows.Count).End(xlUp).Row
> Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete
> ActiveSheet.ShowAllData
>これは、純粋に削除する為にしています。
>そこは別になんでも良いのですが
とはならないと思うのです。
該当がない場合、変数「Lrow」の値は「1」
該当がある場合、変数「Lrow」の値は「5」
となりましたが、これをどの様にしたら良いか分かりません
みたいになると思います。
そこで、次のステップとして、
変数「Lrow」の値によって削除を実行するかしないかをIf文で判断する
という事につなげていくのです。
1行ずつ日本語解説が自分で作れない場合は、
上記で書いたような簡単なテスト環境を作成して、
ステップイン実行を駆使して、
「どこで何をやっているか」
「実行結果がどうなっているか」
を目で見て確認する事を繰り返した方が良い気がします。
(匿名) 2024/01/13(土) 12:22:44
言われた通りテストデータを作って実行しました。
やりたい様にできました。
該当がない場合、変数「Lrow」の値は「1」
該当がある場合、変数「Lrow」の値は「5」
これは、どうやったら分かるのでしょうか?
値 というのは何かで表示されるのでしょうか?
(あなたが居たから) 2024/01/17(水) 13:03:50
あなたの質問に書いてある Lrow = Range("A" & Rows.Count).End(xlUp).Row じゃないんですか? (xyz) 2024/01/17(水) 13:45:35
ステップ実行していって、その行を実行したあとで、 Lrowにカーソルを載せても結果がポップアップされますし、 Debug.Print Lrowを実行して、イミディエイトウインドウに出力することもできます。 直接、イミディエイトウインドウに、 ?Lrow としてもよいでしょう。 デバッグの基本的なことをテキスト(教科書、参考書)で再確認することを推奨します。
(xyz) 2024/01/17(水) 13:49:37
コーディング上の話ですか? If Lrow > 1 Then などとすればよいわけで、 別にどこかに表示しないといけないことじゃないですよね。
そもそもの質問の意図が良く理解できませんでした。 (xyz) 2024/01/17(水) 14:12:19
前の話をよく読んでいませんでしたが、 なんだか話がこじれているんですね。 考え方のプロセスを書いたら、どこにそんな表示があるんだと反発してるんですかね。 虚心坦懐、他人の助言を素直に受け止められるよう推奨します。
(xyz) 2024/01/17(水) 14:31:52
こじれているというか私が余計なことを書いたので、質問者さんを置き去りにしてしまった...のです たぶん、デバッグの仕方(というかVBEの使い方)が未だ理解仕切れてないだけだと思うので、
このサイトの説明とかを読んでもらうのがいいのだと思います。 Excelの神髄 VBEの使い方:デバッグ https://excel-ubara.com/excelvba1/EXCELVBA490.html (´・ω・`) 2024/01/17(水) 14:42:10
そうでしたか。直前発言を取り消します。 納得するまで遠慮なく質問して下さい。 (xyz) 2024/01/17(水) 16:06:51
頑張れ〜
イミディエイトウィンドウの使い方 https://www.youtube.com/watch?v=xANAyfJfLso&t=80s https://tonari-it.com/vba-immediate-command-input/ (あみな) 2024/01/18(木) 10:26:42
ウォッチウィンドウ、ローカルウィンドウもありますよ。
うまく使いましょう。
(ゆたか) 2024/01/18(木) 10:32:29
■8(トピ主には関係してない話ですので無視してください)
>Resize(0)は別の話で、前者も後者も同じ問題を抱えています
あぁ、これまた確かに・・・
前段のOffsetがあふれちゃうところで思考停止してました、
■9
>変数「Lrow」の値が「1」になるはずです。
基本的には最初のほうのコメントも含めて匿名さんのおっしゃる通りかと思います、(たぶん同一の方ですよね?)
ただ、「■7」で述べているように、データによっては↓のようなことになるので、手を入れるのであればその辺も考慮したほうが安牌かなと思いました。(ケチをつける意図はありません。)
Sub 実験用() Dim Lrow As Long With Worksheets.Add .Range("A1").Value = "項目1" .Range("A1").AutoFill Destination:=.Range("A1").Resize(, 8) .Range("H2").Resize(9).Value = WorksheetFunction.Transpose(Array("EA", 2, 3, 4, 5, 6, 7, 8, "EC")) .Range("B13:D13").Value = Array("消えて", "欲しくない", "データ")
.AutoFilterMode = False .Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
Lrow = Range("A" & Rows.Count).End(xlUp).Row Stop MsgBox "A列で最終行をチェックした場合の削除対象" & vbLf & vbLf & _ Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Address(False, False)
.AutoFilterMode = False .Range("H10").ClearContents .Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
Lrow = Range("H" & Rows.Count).End(xlUp).Row Stop MsgBox "H列で最終行をチェックした場合に2行目だった時の削除対象" & vbLf & vbLf & _ Range("H2:H" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Address(False, False) End With End Sub
■10
>少し時間を下さい
>追いつかない(-_-;)
話が横道っぽいところに広がり混乱してしまったのかもしれませんが、上記とも被りますが基本的には匿名さんのコメントの通りでよいでしょう。
(私の 2024/01/09(火) 12:25:45 のコメントも同じことを言っています)
さらに、「■9」や横道部分(データがぎっちりある場合、データがない(項目行しかない場合)も考慮するとすれば、例えばこんな感じにすればよいと思います。
Sub 研究用2() With ActiveSheet .AutoFilterMode = False .Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues
With .AutoFilter.Range If .Rows.Count > 1 Then '★1 If .Columns(8).SpecialCells(xlCellTypeVisible).Count > 1 Then '★2 .Resize(.Rows.Count - 1).Offset(1).EntireRow.Delete '★3 End If End If End With .AutoFilterMode = False End With End Sub
--簡単な解説など--
★1 オートフィルタが設定された範囲が項目行のみじゃない場合のみ処理
★2 (オートフィルタが設定されている範囲の)8列目の可視セルの個数が1より大きい (1だったら項目行のみ(=抽出されたものがない)ということ) さらに、項目行を含む8列目全体を指定することで単一セルを対象にSpecialCellsしないように対策
★3 「.AutoFilter.Range」は項目行を含んでいるので1行下げる (先に1行減らしてからOffsetすることで最大行までデータがあった時の対策になる) (データ行が無いパターンは「★1」で除外されているので考慮の必要なし) また、よっぽど古いバージョンでなければ、可視セルと指定せずとも抽出されたものだけが対象になるのでこれでOK (可視セルに限定しても多分OK)
なお、こういった話はコードだけをじっと眺めていてもなかなか理解できるものではないので、ちゃんとステップ実行などで、どの命令が何をしているか研究し、それでもわからないければ、○○になると理解して××のようにしたけど△△という結果になるなど、実際の結果を踏まえて具体例を挙げつつ"質問"をされるとよいと思います。
そういう意味で↓のようにコメントした次第です。
※1 説明用の提示であり完成品プレゼントの意図はありません。 ※2 採用される場合はステップ実行等により研究のうえ必要な部分のみご自身のコードに組み込んでください。
■11
>値 というのは何かで表示されるのでしょうか?
>すみません、イミディエイト 使い方の使い方が分からないです…
察するに、最初に提示されたコードもご自身で理解して作成されたわけじゃなくて、ネットで見かけたコードをそのまま使っていた(または、想像で語っていた)のではないですか?
そうであれば、これまた上記や皆さんのコメントと被りますが、以下のように学習されるとよいと思います。
(1) ステップ実行でコードを1行ずつ実行して、どの命令が何をやっているのか調べる (2) ↑でわからない命令をネット検索してみる (3) それでもわからなければ、××と理解して○○としたけど△△になるなど、具体例を挙げて質問する
最後に、特に確認がなかったので承知されているのだろうと思っていましたが【ステップ実行】という言葉を聞いたことがなければ↓を読んでみてください。
【ステップ実行】 https://www.239-programing.com/excel-vba/basic/basic023.html http://plus1excel.web.fc2.com/learning/l301/t405.html
また、↓も覚えておいて損はないと思います。
【ブレークポイント】 https://www.239-programing.com/excel-vba/basic/basic022.html https://www.tipsfound.com/vba/01010
【イミディエイトウィンドウ】 https://www.239-programing.com/excel-vba/basic/basic024.html https://excel-ubara.com/excelvba1/EXCELVBA486.html
【ローカルウィンドウ】 https://excel-ubara.com/excelvba4/EXCEL266.html http://excelvba.pc-users.net/fol8/8_2.html
(もこな2) 2024/01/19(金) 07:40:58
> すみません、イミディエイト 使い方の使い方が分からないです… > イミディエイトってのを使うと > If Lrow > 1 Thenが1とか5とか分かるのですか?
この質問に対して、ネットの記事を紹介しましたが、 同時にYouTubeの動画の紹介がありましたので、重複なので私の記事紹介は消しました。
どうですか?動画やそのあと紹介された記事も閲覧して理解できましたか?
イミディエイトウインドウというものの使い方は主として以下の二つです。
1. コードのなかに、 Debug.Print 変数 を追加して、その変数の中身を知る、というのが一つです。
これは、MsgBox 変数でもよいのですが、特に文字列の場合によく使われます。 MsgBoxは閲覧が終わると消えてしまいますよね。 一方、イミディエイトウインドウは、自分で意図的に消さない限りは残ります。 したがって、(数値や)文字列が正しいかどうかを落ち着いて検討したり、 場合によってはメモ帳にさらに転記したり、他の文字列と並べて比較するとかする際に有用です。
2. もうひとつは、コードの簡易実行の場として使うというケースがあります。 新たにプロシージャを作らなくても、コードをそこに書いてEnterを押すことで、 コードが実行できます。
さて、この場合ですが、 > If Lrow > 1 Then が1とか5とか分かるのですか? ・If Lrow > 1 Then というコードのところにカーソルを置いて、F9キーを押すと、 ブレークポイントというものが設定され、そこで実行が止まります。 ・If Lrow > 1 Then はまだ実行されていません。 そこで、イミディエイトウインドウに、 ?Lrow と打ち込んでください。("?" は Print または Debug.Print の省略形、別名です) 結果がすぐに表示されるはずです。 If Lrow > 1 Thenをそのまま実行するだけでは、1より大きくて、次のコードに実行がうつったかどうか しかわかりません。実際に Lrowが何であったか、知りたい、という考えがあれば(なければ終了ですが)、 それを自分で確認できるはずです。 意図をきちんと持ってVBAに向き合うことが必要です。 (もちろん、オートフィルタの結果が該当なしなら、Lrowは1になるはず、 という洞察力が必要です。)
長い文章で疲れたでしょう。 動画を見たりすればわかったはずですが、あえて文章にするとこんなことになるでしょう。 私はこれにて失礼します。
(xyz) 2024/01/19(金) 08:46:09
(あなたが居たから)さんへ イミディエイトウィンドウの使い方が 頑張って、理解ができたでしょうか?
ご自身がトライしようとしているマクロは、コード量こそ 短いですが、落とし穴が多く含む初心者の方には少々難解 なマクロだと思います。
下記の■7で、もこなさんが言っている内容も、イミディエイトウィンドウの 使い方が解らなかったのであれば、ちんぷんかんぷんな内容だったかと思います。
***************************************** ■7 Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete ↑は「Lrow」が2の時に↓のように解釈されるのでマズイとおもいます。
Range("A2").SpecialCells(xlCellTypeVisible).EntireRow.Delete ※単一セルを対象にSpecialCellsを実行すると、全セル?を対象にしたと解釈される仕様(バグ?)のため。
また、↓だと(アクティブシートの)A列の状態によっては「Lrow」が1になることがあり得ます。 Lrow = Range("A" & Rows.Count).End(xlUp).Row
そうすると、↓のよう解釈されることになり、項目行たる1行目が削除対象になるので、やはりマズイと思います。 Range("A1:A2").SpecialCells(xlCellTypeVisible).EntireRow.Delete (もこな2 ) 2024/01/10(水) 13:21:33 *****************************************
では本題、私もまだ半信半疑ですが、(匿名)さんが提示された 2024/01/13(土) 12:22:44 の#サンプルコード#について
Sub Sample()
ActiveSheet.Range("A1").AutoFilter Field:=2, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row If Lrow > 1 Then Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ActiveSheet.ShowAllData
End Sub
実は、ある条件の時だけですが、失敗するかと思っています。 口で言っても理解が難しいと思いますので、実験用のマクロを 作成しました。シートにデータが無い新規シートにてマクロを 実行してみてください。
※マクロを実行したら、下記の表が自動的に作成されるので シートの表( 画面 )と、VBEのイミディエイトウィンドウを 睨めっこしてみてください。
|[A] |[B] [1]|Title1|Title2 [2]| 1|EA [3]| 2|SS [4]| 3|SS [5]| 4|SS
Sub 実験02() '(匿名)さんのマクロ内容になります。
'テスト環境のセット Range("A1").Value = "Title1" Range("B1").Value = "Title2" Range("B2:B5").Value = Application.Transpose(Array("EA", "SS", "SS", "SS")) Range("A2:A5").Value = "=Row()-1" MsgBox "テスト環境を準備しました" Stop '一時停止 '次にマクロを動かす時は、左上のタブにある[▲:緑色]の矢印を押してね
'削除の値を検索して絞込する ActiveSheet.Range("A1").AutoFilter Field:=2, _ Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues MsgBox "条件 [ EA, EC, SB ] で抽出しました"
Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row Debug.Print Lrow
'イミディエイトウィンドウを開く Application.VBE.Windows("イミディエイト").Visible = True Stop '一時停止 '次にマクロを動かす時は、左上のタブにある[▲:緑色]の矢印を押してね
Const vbCrlf2 As String = vbCrLf & vbCrLf MsgBox "条件 [ EA ] の値が、2行目にあるので" & vbCrLf & _ "[ Lrow = 2 ] が確認できましたね" & vbCrlf2 & _ "次の処理で判定をしますよ" & vbCrlf2 & _ "[ If Lrow > 1 Then ] で、[ 2 > 1 ] なので " & vbCrLf & _ "[ IF ~ End If ] を通過しますね"
If Lrow > 1 Then Debug.Print Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).Address MsgBox Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).Areas(1).Row Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).Areas(1).Select Stop '一時停止 Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete Stop '一時停止 End If
'エラーを無視して処理する On Error Resume Next
'オートフィルタを解除 ActiveSheet.ShowAllData If Err.Number <> 0 Then Debug.Print Err.Number Debug.Print Err.Description MsgBox "失敗しました" Exit Sub End If
MsgBox "お疲れさまでした" End Sub
尚、下記の条件では全て成功します。 Application.Transpose(Array("EA", "SS", "EC", "SB")) Application.Transpose(Array("SS", "SS", "SS", "SS")) Application.Transpose(Array("SS", "SS", "SS", "SB")
もこなsの言っている下記の現象ですが、 > ※単一セルを対象にSpecialCellsを実行すると、全セル?を対象にしたと解釈される仕様(バグ?)のため。
きっと SpecialCells の副作用なのか? SpeciallCellsによって Areas(1)の行数に 削除対象行が 2行目だけの場合に限り、入ってしまうのでしょうか?
参考URL ( 下の方 、上は参考まで )
* VBAで行を一括削除出来ない現象と対策について : by えくせるちゅんちゅん https://www.excel-chunchun.com/entry/2019/01/01/120238 *ExcelVBAでオートフィルタで絞り込んだデータの行数をカウントする : by えくせるちゅんちゅん https://www.excel-chunchun.com/entry/20200613-excel-vba-autofilter-rows-count
もし、記載事項に誤りなどがあれば、現在検証中の内容につき お許し下さい。また、なぜ [ 実験02 ]のマクロが失敗するのか ご教授いただける方がいましたら、よろしくお願いします。(o_ _)o (あみな) 2024/01/19(金) 11:20:15
■12
「実験02」について当方(諸般の事情でイミディエイトウィンドウの操作はコメントアウトしました)で実験すると
▼〜.SpecialCells(xlCellTypeVisible).Addressの出力結果 $1:$2,$6:$1048576
▼MsgBoxの表示内容 1
▼〜.Areas(1).Selectの選択範囲 Rows("1:2")
▼〜.Areas(1).Selectの選択範囲 (たぶん)Rows("1:2")及びRows("6:1048576")が削除され(て上に詰められ)る
▼(項目行と抽出結果が削除されてオートフィルタが強制解除されるから) ActiveSheet.ShowAllDataが失敗する エラーナンバーとエラーメッセージがイミディエイトに出力される
という結果になりましたけど何を説明したかったのですか?
■13
> きっと SpecialCells の副作用なのか? SpeciallCellsによって Areas(1)の行数に
> 削除対象行が 2行目だけの場合に限り、入ってしまうのでしょうか?
Sub さんぷる() Dim Lrow As Long Lrow = 2 Range("H2:H" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete End Sub
リンク先をつぶさに見ていないので、意図を誤解していたらごめんなさいですが「■7」では↑のような場合にH2セル(単一セル)を対象にSpecialCellsメソッドを実行したことになり、項目行もオートフィルタが設定されている範囲外のデータも(可視状態であれば)削除対象になりますよと言っているつもりです。
■14
これ以上続けるならば、トピ主のじゃまになりますので別トピを作成されたほうが良いと思います。
(もこな2 ) 2024/01/19(金) 14:21:55
>また混乱するといけないので先に言っておきます。↓はトピ主向けの話ではないです。
もこなさんへ、私はですが、トピ主さん、匿名さん、 閲覧者全員の方に向けて発信しているつもりです。
>これ以上続けるならば、トピ主のじゃまになりますので別トピを作成されたほうが良いと思います。
まったく邪魔していると思っていません。 (匿名)さんへ、トピ主さんへ 下記のサンプルだと、特定条件の時にだけ失敗をしませんか?と尋ねています。
#サンプルコード# Sub Sample() ActiveSheet.Range("A1").AutoFilter Field:=2, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Dim Lrow As Long Lrow = Range("A" & Rows.Count).End(xlUp).Row If Lrow > 1 Then Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If ActiveSheet.ShowAllData End Sub
>匿名さんの回答のみを飲み込みました。 (あなたが居たから) 2024/01/17(水) 12:57:02 >■12 いう結果になりましたけど何を説明したかったのですか?
匿名さんのこの #サンプルコード# に対して、コメントしています。 と同時に、SpecialCells の仕様(バグ?)による含みも交えてです。
■13の話はもうふれませんが、どちらにしてもエラーになりませんか? と尋ねています。 (あみな) 2024/01/19(金) 16:09:27
オートフィルターを掛けて非表示の行は削除されないので これでOKなのでは?
Sub sample() ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Range("A2:A" & Rows.Count).EntireRow.Delete End Sub (´・ω・`) 2024/01/19(金) 17:30:43
・ω・s 正解
>オートフィルターを掛けて非表示の行は削除されないので >これでOKなのでは?
そうじゃんww 。。話...終了
・ω・s 道場へ
明日から弟子入りします。 ρω・ (あみな) 2024/01/19(金) 17:50:43
=====================
う〜ん変に反発されている感じがしますが一応。
■15
イレギュラーなケース(考えた方が良いこと)はいろいろあれど、【オートフィルタで抽出されたものがあるときだけ処理したい】ということであれば、早々に答え出てるんですよ。
要は、【抽出されたものがなければ、Lrowは"1"になる】から【それ以外なら処理する】ってことに気づけたら答えにたどり着けたように思います。
Sub 研究用_改() Dim Lrow As Long
ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Lrow = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row
If Lrow > 1 Then '←追加 ActiveSheet.Range("A2:A" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete End If '←追加
ActiveSheet.ShowAllData End Sub
#匿名さんが、2024/01/13(土) 12:22:44に提示されたものと一緒になっちゃいますがご容赦を。
ですが、そのあと最大行までデータがあるケースとか、SpecialCellsの問題点とかいろいろ話が飛んでしまったので、トピ主のキャパがオーバーしてしまったのでしょう。
■16
>まったく邪魔していると思っていません。
まぁそう思うならご自由に。(止める権利も義務もないので)
なお、よほどのケースでもなければ↓のようにすれば問題にならないと思います。
Sub 研究用_改二() Dim Lrow As Long
ActiveSheet.Range("A1").AutoFilter Field:=8, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Lrow = ActiveSheet.Range("H" & ActiveSheet.Rows.Count).End(xlUp).Row '←H列に変える If Lrow > 1 Then ActiveSheet.Range("A2:H" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Delete '←H列に変える 'ActiveSheet.Range("A2:A" & Lrow).EntireRow.Delete '←そもそもSpecialCellsを使わなくてもOK End If ActiveSheet.ShowAllData End Sub
上記で思った動作にならないのは、以下のようなケースの時でしょうか。
(1)H列の最大行までデータが詰まっていて、Endプロパティで最終行が取得できない。←(´・ω・`)さんコメント済 (2)既に、オートフィルタで別の列の抽出が掛かっているときに、そいつにも影響される ←わかっているとは思いますが一応。
■17
↓だと、オートフィルタが設定される範囲の下に消したくない行があるとマズイような・・・・
Range("A2:A" & Rows.Count).EntireRow.Delete
まぁそれを言い出したら、表外のH列にデータがあればEndプロパティで最大行が正しく取得できないとかになるので私としては↓を推します。
.AutoFilter.Range.Offset(1).EntireRow.Delete オートフィルタが設定された表範囲の1行は必ず空欄(じゃないと「Range("A1").AutoFilter」でデータ行扱いされるから)
(もこな2 ) 2024/01/19(金) 18:41:50
もこなさんへ
まったく反発をしてるようなことは無いのですが^^;
>匿名さんありがとうございます。 >他の皆さんもありがとうございます >しかし、理解できてないので >匿名さんの回答のみを飲み込みました。 >(あなたが居たから) 2024/01/17(水) 12:57:02
トピ主さんの着眼点は上記です。
(もこな2) 2024/01/19(金) 07:40:58 に提案された 下記のマクロの内容については、触れておりません。 *Sub 実験用() *Sub 研究用2()
匿名さんの 、#サンプルコード# についてです。 特定条件の時だけ、エラーになりませんか?って 話だけですよ。 (あみな) 2024/01/19(金) 19:04:02
>あみなさん スレの本題と乖離していますので返信は不要です。 訂正ありがとうございます。 他意が無いとわかりましたので、私の投稿は取り下げます。 少々強い言い方をして申し訳ありませんでした。
勉強熱心なあみなさんの投稿をいつも拝見いたしております。 益々のご活躍を祈念します。
追伸 重箱の隅になりますが、ブラウザの検索機能を用いて「辰」を検索していただくと。。。 (辰) 2024/01/19(金) 20:36:29
(辰)さん ごめんなさい...どこでどう間違いをしたのか すぐ訂正します。大変失礼を致しました。
途中で(匿名)さんから、(辰)さんへ入力が変わっていました。 キー入力の前に、(辰)さんの、別スレを読んでいたので完全に 勘違いです。申し訳ありません。
2024/01/19(金) 21:49:18 修正を完了しました。(o_ _)o (あみな) 2024/01/19(金) 21:35:18
>下記のマクロの内容については、触れておりません。
それはわかっているんです。
「実験02」で言いたいことが、(少なくとも私には)分からないんです。
一応↓を作成して私の環境(Microsoft365/Windows11)でテストすると
Sub 実験02_整理() Dim 配列(1 To 5) As Variant Dim i As Long, Lrow As Long Dim SpecialCellsの対象セル As Range Dim 削除対象のセル As Range
配列(1) = Array("EA", "SS", "SS", "SS") 配列(2) = Array("EA", "SS", "EC", "SB") 配列(3) = Array("SS", "SS", "SS", "SS") 配列(4) = Array("SS", "SS", "SS", "SB") 配列(5) = Array("EA", "EC", "SB", "EA")
For i = 1 To 5 With Worksheets.Add(after:=Worksheets(Worksheets.Count)) .Name = "パターン" & i
.Range("A1:B1").Value = Array("Title1", "Title2") .Range("B2:B5").Value = Application.Transpose(配列(i)) .Range("A2:A5").Value = Application.Transpose(Array(1, 2, 3, 4))
.Range("A1").AutoFilter Field:=2, Criteria1:=Array("EA", "EC", "SB"), Operator:=xlFilterValues Lrow = .Range("A" & .Rows.Count).End(xlUp).Row
Set SpecialCellsの対象セル = .Range("A2:A" & Lrow) Set 削除対象のセル = SpecialCellsの対象セル.SpecialCells(xlCellTypeVisible).EntireRow
Debug.Print .Name Debug.Print "【SpecialCellsの対象セル】" & SpecialCellsの対象セル.Address(0, 0) Debug.Print "【削除対象のセル】" & 削除対象のセル.Address(0, 0)
削除対象のセル.EntireRow.Delete On Error Resume Next .ShowAllData If Err.Number <> 0 Then Debug.Print "エラー番号:" & Err.Number & vbLf & "エラーメッセージ:" & Err.Description Err.Clear End If End With
Debug.Print " " Next i End Sub
パターン1:項目行"も"削除されてオートフィルタが強制解除されるのでShowAllDataが失敗 パターン2:実行時エラーなし パターン3:項目行"が"削除されてオートフィルタが強制解除されるのでShowAllDataが失敗 パターン4:実行時エラーなし パターン5:"データのすべて"が削除されて"抽出状態じゃなくなるので"ShowAllDataが失敗
となりますが、(当たり前ですが)いずれもShowAllDataメソッドでの問題であって、質問の主題(抽出された行があるときだけ処理する)とは別の話でしょう。
(なお、ShowAllDataメソッドが失敗する場合の対処については「■5」で触れています。)
いやいや、そういう話じゃないということならば「特定条件の時だけ、エラーになりませんか?って 話だけですよ。」ってぼかさずに、どういうときにまずいのか具体例を挙げて問題提起されたほうが良いと思います。
■19
ここまで書いておいてなんですが、トピ主が終了宣言してから余談として話を続けるならまだしも、そうじゃない状態でトピ主を置き去りにした話を続けていたらトピ主だって混乱しますよ。
そういう意味で、【私の話は】トピ主にあてたものじゃないですと宣言してから書きました。
あみなさんの話が誰向けとかそういう話はしてません。
■20
上記の理由で、私としてはトピ主の混乱の原因になるようなことをしたくありません。
よって私のコメントを引き合いに出して話をするのはおやめください。
また、"自身の学習"として別トピックを立てて話を続けるのであれば、多少はお付き合いする気もありますが、話が終わっていないトピックで別話を続けるのは、同様の理由で避けるべきとおもっていますので上記についての返信は不要です。
(もこな2) 2024/01/20(土) 13:52:59
はじめに:
★★★ 閲覧される方へ ★★★
ここ [ エクセルの学校 ] での全ての回答者は、質問者への疑問や ご自身で組めない関数、マクロ等をサポートする為に、時として 文章が長文となることがあります。また議論に生ずる事もあります。
ご理解とご了承を賜りますようお願い申し上げます。また、ここから 先は流れを把握されていない方には、 理解しがたい内容となります。
★★★ もこなさんへ ★★★
先に言いますが、なぜ少なくともここの回答者(大先輩)として もこなさんへ敬意を払っているのに、私が喧嘩を売ったような 話になっているのでしょうね? では今回は、ズバリ言いますよ。
もこなさんへ、流れをよく理解してから回答をしてください。 すれば大きな誤解は無いでしょう。むしろ 、話の流れを別の条件にて トピ主を混乱させているのは、他でもない...( もこなさん )あなたです。
★★★[ 流れの説明 ] : 各回答者の返信より一部を抜粋★★★
●流れ : 1
> 追いつかない(-_-;) <<< ★重要 >(あなたが居たから) 2024/01/10(水) 11:35:19
●流れ : 2
(匿名)さんが、2024/01/13(土) 12:22:44 にトピ主さんへ返信をします。
> #テスト環境作成# を作り > #サンプルコード# を実行して
◇テスト環境 : (匿名)さんが指示するレイアウト例 <<< ★重要 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|[A] |[B] [1]|Title1|Title2 [2]| 1|EA [3]| 2|対象外 [4]| 3|対象外 [5]| 4|SB
> 該当がない場合、変数「Lrow」の値は「1」 > 該当がある場合、変数「Lrow」の値は「5」 > となりましたが、これをどの様にしたら良いか分かりません > みたいになると思います。
>変数「Lrow」の値によって削除を実行するかしないかをIf文で判断する >ステップイン実行を駆使して、 >「どこで何をやっているか」 >「実行結果がどうなっているか」 >を目で見て確認する事を繰り返した方が良い気がします。 >(匿名) 2024/01/13(土) 12:22:44
●流れ : 3
> しかし、理解できてないので > 匿名さんの回答のみを飲み込みました。 <<< ★重要 >(あなたが居たから) 2024/01/17(水) 12:57:02
●流れ : 4
> 該当がない場合、変数「Lrow」の値は「1」 > 該当がある場合、変数「Lrow」の値は「5」 > これは、どうやったら分かるのでしょうか? <<< ★重要 > 値 というのは何かで表示されるのでしょうか? >(あなたが居たから) 2024/01/17(水) 13:03:50
●流れ : 5
> すみません、イミディエイト 使い方の使い方が分からないです… > イミディエイトってのを使うと > If Lrow > 1 Thenが1とか5とか分かるのですか? <<< ★重要 >(あなたが居たから) 2024/01/18(木) 10:22:16
●流れ : 6
イミディエイトウィンドウの使い方を、複数の回答者が (あなたが居たから)さんへ、サポートの返信をする。
>(´・ω・`) 2024/01/17(水) 14:42:10 >(あみな) 2024/01/18(木) 10:26:42 >(ゆたか) 2024/01/18(木) 10:32:29
※(´・ω・`)さんは、トピ主さんの不明点を推定されて (あなたが居たから) 2024/01/18(木) 10:22:16 の前に参考URLを提示する ※被った内容があった為に、(xyz)さんは削除して後に、キチンと説明を入れる。
●流れ : 7
(もこな2)さんが、2024/01/13(土) 12:22:44 に トピ主さんへ以下の内容で返信をします。( 一部抜粋 )
> 日曜日に書いたものの、トピ主の反応を待ってからコメントしたほうが良いのかもと温めていたら、 <<< ★重要 〜〜〜〜 〜〜〜〜〜〜〜〜〜〜 > 完全に投稿するタイミングを逃してしまいましたが、せっかくなので投稿しておきます。 ~~~~~~~~~~~~~~~~~~~~~
満足ですか? 悲鳴と言うと少々オーバーな表現ですが、(あなたが居たから)さんは 複数回に渡ってされていますよね。でこの内容ですか? トピ主の状況からして、私にはとてもできない内容ですね。
>トピ主の反応を待ってからコメントしたほうが良いのかもと温めていたら、… それは、あなたが勝手に...妥協をしただけではないのですか?
>■9 >変数「Lrow」の値が「1」になるはずです。 >ただ、「■7」で述べているように、データによっては↓のようなことになるので、 > 手を入れるのであればその辺も考慮したほうが安牌かなと思いました。(ケチをつける意図はありません。)
※マクロの、重要部分を一部抜粋
> Sub 実験用() > .Range("B13:D13").Value = Array("消えて", "欲しくない", "データ") > MsgBox "H列で最終行をチェックした場合に2行目だった時の削除対象" & vbLf & vbLf & _ > Range("H2:H" & Lrow).SpecialCells(xlCellTypeVisible).EntireRow.Address(False, False) > End Sub
ここで、Array("消えて", "欲しくない", "データ") この条件の話が必要ですか? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ さらに
> Sub 研究用2() > With .AutoFilter.Range > If .Rows.Count > 1 Then '★1 > If .Columns(8).SpecialCells(xlCellTypeVisible).Count > 1 Then '★2 > .Resize(.Rows.Count - 1).Offset(1).EntireRow.Delete '★3 > End If > End If > End With > End Sub
ここで、新たな( 違う書き方 )をした提案が必要ですか? (あなたが居たから)さんのスキルを、度外視した提案内容ではありませんか?
いけないとは言いませんよ。タイミングは、(あなたが居たから)さんの イミディエイトウィンドウの使い方の理解と、[ Lrow ]変数の[ 1 , 5 ]等の確認 が出来たかが、先ではないのでしょうか?( まだ、返信がないのですよ ) <<< ★重要
●流れ : 8
(xyz)さんが、Lrow 取得の説明をして <<< ★重要 トピ主さんへ少しでも理解が進むようにする
> 長い文章で疲れたでしょう。 > 動画を見たりすればわかったはずですが、あえて文章にするとこんなことになるでしょう。 > 私はこれにて失礼します。 >(xyz) 2024/01/19(金) 08:46:09
●流れ : 9
(あみな) 2024/01/19(金) 11:20:15 が (あなたが居たから)さんへ <<< ★重要 イミディエイトウィンドウの使い方が出来たのか? Debugの取り方が 無事に動作確認が出来たのかを案じて、以下の内容にて返信をする。
( 一部抜粋 ) > 下記の■7で、もこなさんが言っている内容も、イミディエイトウィンドウの > 使い方が解らなかったのであれば、ちんぷんかんぷんな内容だったかと思います。
★このスレの現段階での最重要ポイントは、トピ主さんが[ Lrow ]変数の取得問題です。 <<<★重要 理解できたか?
[ Lrow ]変数の内容を議論中である事と、SpecialCellsの仕様(バグ?)の話をされています。 私は、この(バグ?)の件は、知らなかった為に「半信半疑」ですがと入れる。 もし、記載事項に誤りなどがあれば、現在検証中の内容につきお許し下さい。と最後に入れる。
正直いって(あなたが居たから)さんがすぐに理解を出来る内容ではありませんよね? (バグ?)の話をするなら、参考URLを載せてあげても良いのではないでしょうか? https://www.limecode.jp/entry/trap/specialcells 絶対にとは、いいませんが。。。
>■20 >上記の理由で、私としてはトピ主の混乱の原因になるようなことをしたくありません。 >よって私のコメントを引き合いに出して話をするのはおやめください。 >(もこな2) 2024/01/20(土) 13:52:59
これが引き合いに出して困るような話ですか?
【 [ 実験02 ]マクロ私の説明 】
> では本題、私もまだ半信半疑ですが、(匿名)さんが提示された <<< 重要 > 2024/01/13(土) 12:22:44 の#サンプルコード#について <<< 重要
> 実は、ある条件の時だけですが、失敗するかと思っています。 > 口で言っても理解が難しいと思いますので、実験用のマクロを > 作成しました。シートにデータが無い新規シートにてマクロを > 実行してみてください。
それを最初に[ 実験02 ]のマクロに組み込む。( これ普通ですよね? ) <<< ★重要 もこなさんは、↓ レイアウトまで記載しているのに理解ができませんか?
|[A] |[B] [1]|Title1|Title2 [2]| 1|EA [3]| 2|SS [4]| 3|SS [5]| 4|SS
★また下に、成功する時の事も入れています。 > 尚、下記の条件では全て成功します。
> Application.Transpose(Array("EA", "SS", "EC", "SB")) > Application.Transpose(Array("SS", "SS", "SS", "SS")) > Application.Transpose(Array("SS", "SS", "SS", "SB") > (あみな) 2024/01/19(金) 11:20:15
★この話は、匿名さんの 、#サンプルコード# についてです。 これだけ説明を入れているのに対して、もこなさんは下記の返信をされていますがなんでしょうね?
> いやいや、そういう話じゃないということならば「特定条件の時だけ、エラーになりませんか?って 話だけですよ。」 > ってぼかさずに、どういうときにまずいのか具体例を挙げて問題提起されたほうが良いと思います。
★ぼかしてますか?
↓この下の話ではありませんよ。この話は、匿名さんの 、#サンプルコード# についてです。 ↓ここの話は既に終わっています。 > .ShowAllData は IFブロックの外に出した方がいいということですねの話ではありません。 >(なお、ShowAllDataメソッドが失敗する場合の対処については「■5」で触れています。)
★[ 実験02 ]のマクロは、変数「Lrow」の確認の取り方と、 Application.Transpose(Array("EA", "SS", "SS", "SS")) の条件の時だけ 匿名さんの 、#サンプルコード# が失敗するかと思っています。 <<< ★と説明をしていますが?
★誰宛にについて
>(あなたが居たから)さんへとも言ってますが…。 <<< ★重要 (匿名さんへとは言わずとも解るでしょう) >(あみな) 2024/01/19(金) 11:20:15
>もこなさんへ、私はですが、トピ主さん、匿名さん、 <<< ★再度 > 閲覧者全員の方に向けて発信しているつもりです。 >(あみな) 2024/01/19(金) 16:09:27
↓もこなさんがおっしゃるには下記のようですね。 >あみなさんの話が誰向けとかそういう話はしてません。 >質問の主題(抽出された行があるときだけ処理する)とは別の話でしょう。
★[ 実験02 ]のマクロは (匿名)さんが、(あなたが居たから)さんへ提示された #サンプルコード# と同じテスト環境のままですが? 問題ありますか? 違う想定の話ばかりをしているのは、(もこなさん)あなたじゃないんですか?
●流れ : 10
> ■12 >「実験02」について当方(諸般の事情でイミディエイトウィンドウの操作はコメントアウトしました)
もこなさんの実行環境に、興味はありません。 まして、(あなたが居たから)さんへ少しでも解りやすくと Debug.Print しているのに、そっくりの内容をここで挙げてどうするんですか?
>これ以上続けるならば、トピ主のじゃまになりますので別トピを作成されたほうが良いと思います。 >(もこな2 ) 2024/01/19(金) 14:21:55
流れを断っているのは、誰なんでしょうかね? 今更、見ていないかったとか...言わないでくださいね。 それだけの文章量の内容で、コメントをしているのですから。
●流れ : 11
私の数倍のマクロのスキルがある(もこな2 )方が、 私の[ 実験02 ]の(匿名)さんが提示された #サンプルコード#と同じ内容にしてあるものを <<< ★重要 IF文を削除して、わざわざ変更してテストしてどうするんでしょうか?( ↓下 : 重要部分を抜粋 ) <<< ★重要 〜〜〜〜〜〜 Sub 実験02_整理() If Lrow > 1 Then '★ないですよ Set SpecialCellsの対象セル = .Range("A2:A" & Lrow) Set 削除対象のセル = SpecialCellsの対象セル.SpecialCells(xlCellTypeVisible).EntireRow Debug.Print .Name Debug.Print "【SpecialCellsの対象セル】" & SpecialCellsの対象セル.Address(0, 0) Debug.Print "【削除対象のセル】" & 削除対象のセル.Address(0, 0) 削除対象のセル.EntireRow.Delete End If '★ないですよ End Sub (もこな2) 2024/01/20(土) 13:52:59
>となりますが、(当たり前ですが)いずれもShowAllDataメソッドでの問題であって、質問の主題(抽 >出された行があるときだけ処理する)とは別の話でしょう。
★( IF文 )が無いと全く別の実行環境ですよ。 <<< ★重要 ↓さらに下記の条件を追加する >配列(5) = Array("EA", "EC", "SB", "EA") '★全削除対象行 <<< ★重要
全削除対象行の条件を追加してますが、必要ですか? こんな条件の話はいらないのではないのでしょうか?
>■19 >ここまで書いておいてなんですが、トピ主が終了宣言してから余談として話を続けるならまだしも、そ >うじゃない状態でトピ主を置き去りにした話を続けていたらトピ主だって混乱しますよ。
私の[ 実験02 ]は(匿名)さんが提示された #サンプルコード#と同じ内容です。 失敗する事例を挙げて確認の為、問いているのが不要な内容なのでしょうか?
>■20 >上記の理由で、私としてはトピ主の混乱の原因になるようなことをしたくありません。 >よって私のコメントを引き合いに出して話をするのはおやめください。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 流れを理解されていないから、こうなるのでしょうね。( 引き合いの件が明確にわかりかねますが ) トピ主さんの今現在における一番必要な状況を、お考えになられてはどうですか?
>また、"自身の学習"として別トピックを立てて話を続けるのであれば、多少はお付き合いする気もありますが、 >話が終わっていないトピックで別話を続けるのは、同様の理由で避けるべきとおもっていますので上記についての返信は不要です。 ~~~~~~~~~~~~~~~~~~~~~~ >(もこな2) 2024/01/20(土) 13:52:59
>「実験02」で言いたいことが、(少なくとも私には)分からないんです。 なんでしょうかね? あなたのスキルで、この内容で解らないとかあるんですか?
>上記についての返信は不要です。
「でたらめ」実験してさようならですか?
★別件 : この際なので、ついでに言っておきます。
> ※1 説明用の提示であり完成品プレゼントの意図はありません。 >(もこな2 ) 2024/01/09(火) 19:17:20
> そういう意味で↓のようにコメントした次第です。 > ※1 説明用の提示であり完成品プレゼントの意図はありません。 >(もこな2) 2024/01/19(金) 07:40:58
2度目は珍しく、弁明ですか?
> 匿名さんの回答のみを飲み込みました。 >(あなたが居たから) 2024/01/17(水) 12:57:02
この状況でもされるのですね?
行を削除する程度の内容で、いちいち必要でしょうか? 過去にも、他の回答者から指摘をされていましたよね? まだ続けるんですかね?気持ちよく、提案されたらいかがですか?
将来、拡張があるような話ならですが、土台だけを作成するので 後の微調整は、ご自身でお願いしますなら普通なのですがね。 この程度の内容なら完成品プレゼントで良いのではないですか?
以上 (あみな) 2024/01/21(日) 12:29:13
(もこな2) 2024/01/21(日) 13:35:04
(閲覧者) 2024/01/21(日) 14:28:53
閲覧者さんへ
>★別件 : この際なので、ついでに言っておきます。 ご忠告をありがとうございます。言い過ぎているかもと 思っております、心に受け止めます。
でも、よくこの短い時間で優劣を付けられますよね。
私の最後の投稿時間は、下記ですよ。 (あみな) 2024/01/21(日) 12:29:13 ~~~~~~~~~~~~~~~~~~ もしかして、裁判関係職の方でしょうか? 特に返信を希望する内容ではありません。 (あみな) 2024/01/21(日) 19:01:36
もこなさんへ
トピックを立てていただけるんですね。 ありがとうございます。
(あみな) 2024/01/21(日) 12:29:13 を複製して ご用意いただけるって事ですね。問題ありません。
要約( 題材 )は、どうされますか? [ 談:議論会 ]とでもされるおつもりでしょうか?
百家争鳴に合わない内容でなければ なんでもいいのですが。。。
あと、二人だけの発言の場に、ならないかもと思います。 他者の発言もあってもいいのですが、私の希望としては 昨年1年間の、回答件数が30件程度以上の方であるか、過去に ここで回答者としてされていた方等と、制限が欲しい ところですが、どのようにお考えでしょうか?
★その他、条件がございます。
トピックを立てられた、もこなさんが最初の発言になると思います。 いきなりの長文での発言は、ご遠慮ください。目安( 500文字迄 ) マクロについては、カウントは無しとします。
後、この書体の大きさで、お願いできませんか? 横の文字数もこの程度か、もう少々長い程度にしていただくと、嬉しいのですが。。 自分が慣れているので、読みやすい条件ですいません。
この↓文字の大きさは、しないと言う意味です。
(あみな) 2024/01/21(日) 21:30:32
そうでしたね。失礼しました。 大きな、間違いでもなく,,,過去ずっと これで呼ばさせていただいております。
元々が(もこな)さんで、2が無かったですからね。 でも次から、(もこな 2)さんにさせていただきますね。
因みに、あなたから(あほ)呼ばわりされる 言われはない。 (あみな) 2024/01/21(日) 21:56:15
(もこな2) 2024/01/21(日) 23:09:25
私はこの掲示板ではありませんが、
他の掲示板で多数の方々に助けられて
VBAができるようになりました。
ですから恩返しのつもりで、
このような掲示板で私のできる事は回答をつけるようになりました。
そして、私を育ててくれた掲示板で、
1つ1つできるようになるために、
以下のような事を指摘して頂いたおかげだと思っております。
丸投げをやめましょう。作成してもらう事が目的なら、
有料でやってもらうべきです。
一気に進めるのではなく、わからない事、躓いていることを、
1つずつ分けて解消していきましょう。
本番データでいきなり実行するのではなく、似たような形の表を小さく作って
(例えば3列4行くらい)、そこでVBAを実行する習慣をつけましょう。
といった感じです。
ですから私は、回答のコードを載せるのではなく、
ヒントになるようなことを掲載して、
質問者が「自分でできた」という感覚を覚える事で、
引き続きVBAに挑戦する、結果VBAができるようになる。
となるように心がけて回答しているつもりです。
>フィルタで検索をして該当があれば下記を実行
従って、上記の事だけをクリアするためだけを
できるようになるための導きをするための回答をしているのです。
他の条件でエラーが出るとかは意識していません。
もちろん、「有料で作成してください」といわれて作成しするのであれば、
テストデータも多数作成するでしょうし、
テスト仕様書も、プログラム仕様書もセットで納品して、
バグがない様に作成しますけど…
又、質問の内容、質問する言葉を見る限りでは、
VBAに不慣れな方である事も推測できます。
特にイミディエイトウインドウの使用方法が分からない
という事は、VBAに不慣れな事が分かる質問だと思います。
それは、以下のような回答からも推測できるような気がします。
>他の皆さんもありがとうございます
>しかし、理解できてないので
>匿名さんの回答のみを飲み込みました。
そこで、さらに上を行く事(例えばある条件だけはエラーが出る)を言っては、
質問者を混乱させるだけだと思います。
一つずつクリアしていく事にならなくなってしまうからです。
従って、私は、イミディエイトウインドウの説明のみをしている方、
又はそのリンクを貼っている方だけで十分のような気がします。
私の説明不足で多数の方の混乱をさせてしまったようです。
質問者にも、回答をつけてくださった皆様にも
混乱を招いてしまった事をお詫び申し上げます。
大変申し訳ございませんでした。
(匿名) 2024/01/21(日) 23:11:18
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.