私の質問を拝読いただき、ありがとうございます。
マトリックス形式のデータがワークシートに埋め込まれています。
特定のフィールドに入っている各レコードのデータをエクセルで検査するマクロを作ろうとしています。
検査方法としては、一定量以上の文字列が入っているセルを特定の色で塗るというものです。
(条件付書式でも同じことが可能ですが、操作の関係上、マクロで実現したいものです。)
次のようなコードを実行すると、各セル内の文字量が80文字を超えていようがいまいが、
B列の全てのセルがcolor=7で塗りつぶされてしまいます。
------------------------------------
Private Sub 検査()
Dim objColumn As String
Dim objCell As Range
Dim mojiByt As Integer
i = 2
objColumn = Columns(i).Address
For Each objCell In Range(objColumn)
With objCell
mojiByt = LenB(.Value)
Select Case mojiByt
Case Is > 80
.Interior.Color = 7
Case Else
.Interior.Color = xlNone
End Select
End With
Next
End Sub
------------------------------------
このコードのエラーをご指摘いただきますと幸いです。
よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
こんにちは。
ColorプロパティにはRGB関数で色を指定します。
.Interior.Color を .Interior.ColorIndex に修正するか、
又は、
= 7 を RGB(255, 0, 255) に修正してみてください。
なお、
.Interior.Color = xlNone の xlNone を RGB(255, 255, 255) に
してしまうと、枠線も白く塗りつぶされてしまいますので、こちらは、
Color を ColorIndex にした方がよいと思います。
また、一つずつのセルに背景色を設定するのではなく、最初にすべての
セルを塗りつぶしなしにしてから該当するセルだけ色を付けた方が速く
なります。(列全体で指定されているので範囲を絞り込めれば、もう少し
速く処理できると思います。)
Private Sub 検査()
Dim objColumn As String
Dim objCell As Range
Dim mojiByt As Long
Dim i As Long
i = 2
objColumn = Columns(i).Address
For Each objCell In Range(objColumn)
With objCell
mojiByt = LenB(.Value)
Select Case mojiByt
Case Is > 80
' .Interior.Color = RGB(255, 0, 255)
.Interior.ColorIndex = 7
Case Else
' .Interior.Color = RGB(255, 255, 255)
.Interior.ColorIndex = xlNone
End Select
End With
Next
End Sub
Private Sub 検査2()
Dim objColumn As String
Dim objCell As Range
Dim mojiByt As Long
Dim i As Long
i = 2
objColumn = Columns(i).Address
Range(objColumn).Interior.ColorIndex = xlNone
For Each objCell In Range(objColumn)
If LenB(objCell.Value) > 80 Then
objCell.Interior.Color = RGB(255, 0, 255)
' objCell.Interior.ColorIndex = 7
End If
Next
End Sub
貴重なご意見、ありがとうございました。コードをきちんと検証してくださり、ありがとうございます。ご提案いただいたコードを試すことができましたので、自分の思い違いなどを確認させていただくことができました。非常にありがたいご回答をいただきまして、感謝しております。
No.5
- 回答日時:
回答3、myRangeです。
回答3で提示したサイトを覗いてみましたか?
ふつうに読めばそこに答えがあることが分かると思うのですが、
にも拘わらず
>80文字は80byteの誤りです
との文言。
これは提示のサイトを覗いていないということですね?
そこには次のようなことが書いてあります。
例えば、
対象文字列を「あa」とした場合。(但し、a は半角)
LenB("あa") ⇒ 4
LenB(StrConv("あa", vbFromUnicode)) ⇒ 3
さて、質問者はどちらのバイト数を取得したいのでしょうか。
いま一度、提示したサイトを覗いてみたらどうでせう。
以上です。
No.4
- 回答日時:
だったらステップ実行してみながら変数が自分の意図したようになっているかCheckしてみましょう。
デバッグの基本です。
どこに問題があるか絞れるから。
このコードをみる限りまた質問者の言うとおり長さの条件も間違っていないのならcell内の文字列の長さが80Byte以上あるのでしょう。
データの方をチェックしましょう。長い空白が入っていませんか?
本当にこのコードをテストしたのですか
65536回のループになりますよ。
どのくらいかかりました?
またこのコードには無駄が多い
i = 2
objColumn = Columns(i).Address
For Each objCell In Range(objColumn)
結局
For Each objCell In Range("B:B")
と同じでしょ
i を変数にしそのrangeからアドレス文字列を取り出し、それでまたrangeを指定する。
このコードだとB列の全部のcellをみるから65536回のループになる
本当にそれでいいのかな
条件で2つに分けるだけならIf文が常道でなぜCase文を使うかわからない。
どこかから拾ってきたコードをよく読まずに(意味を調べずに)使っているのでしょうか
お忙しい中、ご回答、ありがとうございました。専門家でいらっしゃるということで、貴重なアドバイスに感謝しております。
コードの無駄につきまして、説明不足でご面倒をお掛けしました。コードの運用方法に変更の可能性があるため、他の列、他の判定要素を入れられるようなコード記述とさせていただきました。
ループは確かに時間が掛るものでして、おそらく、コンピュータのスペックにもよると思うのですが、ほぼ、ブランクデータの65536ループで10秒程度要しました。事前にデータの総レコードを入力させるなどして、検査ターゲットを絞り込ませるようなコードにすべきと思いました。
貴重なご意見、ありがとうございました。
No.3
- 回答日時:
LenB を Len に変えてみましょう。
mojiByt = Len(.Value)
●下記マイクロソフトサイトを一読することをお勧めします。
http://support.microsoft.com/default.aspx?scid=k …
Colorプロパティの件は既出の回答で指摘さてるので省略
以上です。
No.2
- 回答日時:
lenBだと41字で80Byteを越えちゃいますよ
それでいいのですか?
質問文の中で「文字数」とあるのでlenのほうじゃないですか
ステップ実行してmojiBytがいくつになるか見てください。あなたの思ったとおりの数字になっていますか?
すみません余計なことかも知れませんがデバッグの方法をきちんと覚えておかれたほうがいいですよ。この欄の質問にあまりにも自分で検証したことがない人が多いので
この回答への補足
ご回答ありがとうございます。質問が悪く、申し訳ございません。80文字と書かせていただいている部分は、80byteの誤りです。よろしくお願いします。
補足日時:2009/09/16 18:10専門家でいらっしゃるということで、貴重なアドバイスに感謝しております。セル内のデータ量を検査するものでして、lenbを使いたかったのですが、「文字数」という適切でない言葉を使用したため、ご面倒をお掛けしました。お忙しい中、ご回答、ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Visual Basic(VBA) エクセルVBAのコードで質問です。 下のコードはJ16の文字列をB3を起点とする範囲から探して、見つ 5 2023/04/07 11:07
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Excel(エクセル) 日付で矢印マクロ 4 2023/07/25 16:47
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2022/05/26 17:19
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) ExcelVBAのマクロについて。 9 2022/05/04 14:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA 配列からセルに「...
-
VBAマクロ実行時エラーの修正に...
-
VBA 複数条件の分岐処理の上手...
-
【VBA】写真の貼り付けコードが...
-
EXCEL VBA 文中の書式ごと複写...
-
Excelで空白セル直前のセルデー...
-
VBAでユーザーフォームにセル値...
-
VBA:日付を配列に入れ別セルに...
-
Excel UserForm の表示位置
-
複数指定セルの可視セルのみを...
-
VBA にて、条件付き書式で背景...
-
下記のマクロの説明(意味)を...
-
入力規則のリスト選択
-
Excel VBA IF文がうまく動作し...
-
VBA チェックボックスで
-
エクセルの合計を自動で表示さ...
-
C# DataGridViewで複数選択した...
-
excelで結合セルの場合にエラー...
-
特定の色のついたセルを削除
-
QRコード作成マクロについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAマクロ実行時エラーの修正に...
-
Excelで空白セル直前のセルデー...
-
エクセルVBA 配列からセルに「...
-
Excel UserForm の表示位置
-
【Excel VBA】一番右端セルまで...
-
エクセルの合計を自動で表示さ...
-
【VBA】【ユーザーフォーム_Lis...
-
EXCEL VBA 文中の書式ごと複写...
-
下記のマクロの説明(意味)を...
-
Excel VBAでCheckboxの名前を変...
-
【VBA】写真の貼り付けコードが...
-
特定の色のついたセルを削除
-
VBA:日付を配列に入れ別セルに...
-
VBA にて、条件付き書式で背景...
-
DataGridViewのフォーカス遷移...
-
関数の引数でrangeを指定したとき
-
入力規則のリスト選択
-
DataGridViewで指定したセルの...
-
VBAでユーザーフォームにセル値...
-
複数指定セルの可視セルのみを...
おすすめ情報