- ベストアンサー
EXCE2010マクロで文字の比較ができない
- EXCE2010のシートに入っている文字の比較を行っても期待する結果が得られない問題に困っています。
- シートには例題.jpgの通りにデータが入っており、B列で201301だけを抽出したいです。
- マクロを使ってMaxRowとMaxColを設定し、Forループで条件を満たさない行を削除する処理を行っています。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#6、お礼欄、補足欄へのレスです。 > 下のマクロは文字バケしてみえませんでした。 あ。すみません。 Debug.Print とタイプするよりも早く書く方法として Debug.? と、VBEのコードウィンドウでタイプすると、 Debug.Print と、VBEが自動的に変換してくれる機能があり、私はいつもそうしているものですから、 いつもの癖で書いてしまいました。 文字化けではありませんから、安心してください。 下のマクロは With Range("B2") の部分を With ActiveCell のようにセル参照だけ換えて、日常的にチェック用に使って貰えれば、と思います。 私が課題に挙げたセルの扱い方が、そのうち自然に解る様になると思いますよ。 > 項目行が削除されていました。 For i = MaxRow To 2 Step -1 最下行から順に2行目まで(項目行が1行という前提で)処理しています。 項目行が3行なら For i = MaxRow To 4 Step -1 という要領で対処してください。 > どちらのDebug.Printが書いたのかも判りません そういう事を避ける意味で、普通は Debug.Print "Value : "; Cells(i, "B").Value Debug.Print "nengetsu : "; nengetsu という風に書くのがデバッグの基本です。 > 上のマクロのNext iの後に、Debug.Print 上のマクロのNext iの前に書けば、必要場情報が得られます。 > Rows(i).Interior.Color = vbRedで色を変えられていると思うのですが、色は変わりませんでした。 これも説明しておけばよかったですね。 よーーーく見ると ' Rows(i).Interior.Color = vbRed 先頭に ' が書いてあって、VBE画面でも通常のコードとはべつの色で示されている筈です。 先頭に ' を付けることをコメントブロックするとかコメントアウトするとか呼びます。 コードウィンドウに何を書いたとしても、コメントブロックしてしまえば、 それはただのメモ書きとして扱われます。 (これも、先ほどの Debug.? と似ていて、 本来は行頭に Rem と書く代わりのショートカットですが、この場合はむしろRemを使うケースの方が少ないです。) つまり、Rows(i).Interior.Color = vbRed は、実行されません。 では何故それを書いておいたかというと、 行を削除するようなマクロでは、処理前と処理後の比較・検証が大変ですよね。 なので、一旦、削除するのはやめて、色を付けて、テストして、検証を簡単にしようという意味で、 テスト用の記述を添えおいた、ということです。 ' Rows(i).Interior.Color = vbRed Rows(i).Delete Shift:=xlShiftUp これを、一時的に Rows(i).Interior.Color = vbRed ' Rows(i).Delete Shift:=xlShiftUp と書き換えてみてください。 今度はRows(i).Delete Shift:=xlShiftUpがコメントになって実行されませんから、 本番で削除しようとする行、すべてを赤い色で確認できます。 テストが済んだらコードを元に戻して置けばよいですし、 元々削除予定の行ですから、セル色はそのままで削除しちゃってもいいですよね。 頑張ってください。
その他の回答 (6)
- cj_mover
- ベストアンサー率76% (292/381)
お邪魔します。 まず、ご提示のコードをそのまま 無難な方法で書き換えてみます。 試した結果をこちらに解る様に具体的にフィードバックしてください。 (ダメでした、という返信はお断りします。) Sub Re8048579() Dim nengetsu As String Dim MaxRow As Long Dim MaxCol As Long Dim i As Long nengetsu = "201301" MaxRow = Range("B65536").End(xlUp).Row MaxCol = Range("IV1").End(xlToLeft).Column For i = MaxRow To 2 Step -1 If Cells(i, "B").Text <> nengetsu Then ' Rows(i).Interior.Color = vbRed Rows(i).Delete Shift:=xlShiftUp End If Next i End Sub 上のコードでも、期待の結果が得られない場合。 VBAというよりEXCELでのセルの扱いに関する理解をもう少し深めて、 色々な条件によって、違いが生じる、それぞれの場合、に適した方法 を、自分で、見つけようと考えなければ、解決は無理です。 B列のデータ型は? B列の表示形式は? B列は数式? B列の実際の値は? B列の見た目の値は? 下のコードを実行して、イミディエイトウィンドウに出力されたものを 丸ごと、補足欄に張付けてみましょう。 B列の設定を反映できずに失敗していた場合は、 この実行結果を見れば対処を見つけられます。 Sub CheckCellsProperties() With Range("B2") Debug.? TypeName(.Value), .NumberFormat, .NumberFormatLocal, .HasFormula Debug.? "■v■"; .Value; "■v2■"; .Value2; "■f■"; .Formula; "■t■"; .Text; "■" End With End Sub
お礼
大変申し訳ありませんでした。補足の補足です。Rows(i).Interior.Color = vbRedで色を変えられていると思うのですが、色は変わりませんでした。あまりにもうれしかったので、書き忘れました。大変申し訳ありませんでした。
補足
下のマクロは文字バケしてみえませんでした。上のマクロをコピペしました。結果は、項目行を除いて旨くいきました。項目行除いての意味は、項目行が削除されていました。まだ、手計算はしておりませんが、きっと合っていると思います。上のマクロのNext iの後に、Debug.Print Cells(i, "B").Value Debug.Print nengetsuと入れましたが、201301 201301が出ました。なぜ2回か判りません。また、どちらのDebug.Printが書いたのかも判りません。これから、項目行が何故、削除されたか、何故イミディエイトウインドウに201301 201301と書かれたかを調査したいと思います。本当に有難う御座います。これから自力で頑張ってみます。しかし、またお世話に成るかもしれませんので、旨く検証出来れば、ベストアンサーにさせて頂きたいと思います。結果が出次第補足でお知らせいたします。何卒宜しくお願い申し上げます。
- K Kazz(@JazzCorp)
- ベストアンサー率31% (549/1751)
文字、というんだから文字ナンでしょう、、、 'Option Explicit Sub main() MaxRow = Range("B65536").End(xlUp).Row For i = MaxRow To 2 Step -1 If (Cells(i, "B").Value <> "201301") Then ActiveCell.EntireRow.Delete Shift:=xlShiftUp End If Next i End Sub
補足
やはり結果は、NGでした。皆さん本当に有難う御座います。また、この質問を見ている方々には、大変申し訳ないと思っております。しかし、もう少しお付き合い願います。何卒宜しくお願い申し上げます。
- tom04
- ベストアンサー率49% (2537/5117)
No.2です。 補足に >コピペしました。結果はNGでした。 とありますが、原因としては (1)画像を見る限りSheet1だけしか表示されていないので、Sheet2が存在しない。 (2)B列がシリアル値である。 といったコトが考えられます。 Sheet見出しにSheet2が表示されているかどうか確認して今一度試してみてください。 (当然Sheet名が違ってもエラーとなります。) 尚、B列がシリアル値で表示形式だけを yyyymm としている場合は前回のコードでは無理ですので、 B列がシリアル値のコードを載せてみます。 Sub Sample1() Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") wS2.Cells.ClearContents With wS1 .Cells(1, 1).AutoFilter Field:=2, Criteria1:=">=2013/1/1", _ Operator:=xlAnd, Criteria2:="<2013/2/1" .Cells(1, 1).CurrentRegion.Copy wS2.Cells(1, 1) .AutoFilterMode = False End With End Sub ※ 今度はどうでしょうか?m(_ _)m
補足
これもコピペしましたが結果は、NGでした。
- pa_cotta
- ベストアンサー率43% (25/58)
debug.print 変数名 これでイミディウェイトウィンドウ(だった気がする…)に変数の内容が出力されるので、期待している値が取得できているかどうかを確認しましょう。
補足
ANo.5さんのマクロでDebug.Printを試してみました。しかし、Cells(i, "B").Valueはイミデイトウインドウには出ませんでした。しかし、比較している"201301"は出てきました。しかし、数が多すぎて値は合っているのですが、やはり、Cells(i, "B").Valueは出ないので、デバッグにはなりませんでした。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! >B列で201301だけを抽出したく・・・ とありますのでB列は日付(シリアル値)ではなく、単に201301のように数値だけが入力されているという解釈です。 元データはSheet1にあり、Sheet2に表示するようにしてみました。 標準モジュールに↓のコードをコピー&ペーストしてマクロを実行してみてください。 尚、Sheet1のデータは画像どおり1行目はタイトル行になっているとします。 Sub Sample1() Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") wS2.Cells.ClearContents With wS1 .Cells(1, 1).AutoFilter field:=2, Criteria1:=201301 .Cells(1, 1).CurrentRegion.Copy wS2.Cells(1, 1) .Activate .AutoFilterMode = False End With End Sub こんな感じではどうでしょうか?m(_ _)m
補足
コピペしました。結果はNGでした。
- FEX2053
- ベストアンサー率37% (7991/21371)
nengetsuの変数は、どういう形で入ってますか? 日付シリアルの比較は往々にして間違いますよ。 あと、IF文の書式がそもそも間違ってるんですが・・・。
補足
全くおしゃられる通りでした。 If MyBln = Cells(i, "B") <> nengetsu Then ActiveCell.EntireRow.Delete Shift:=xlShiftUp End If でした。どうもすみません。
お礼
本当に有難う御座います。やっとマクロのプログラムが動作して、正解な回答が出る様になりました。きめ細かい、親切でご丁寧な解説どうも有難う御座います。この質問を見ていた方々や、回答を寄せられた方々にも、本当に有難う御座います。1回実行して、検証するまで時間が掛かりどうもすみませんでした。今後とも何卒宜しくお願い申し上げます。