• 締切済み

御願いします

Sheet4にある表から同じ値を検索するマクロです。 同じ値があったセルの背景を黄色に,ただし空白セルは空白の ままにしたいのですが。 うまく動きません。 初めてマクロを立てました。 どうか解決にお力かして下さい。 ********************************************************* Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim RetRange As Range Dim lngYCnt As Long Dim intXCnt As Integer lngYCnt = Worksheets("Sheet4").UsedRange.Rows.Count intXCnt = Worksheets("Sheet4").UsedRange.Columns.Count For i = 1 To lngYCnt For j = 1 To intXCnt If Cells(i, j).Value = "" Then Cells(i, j).Interior.ColorIndex = xlNone Else Set RetRange = Selection.Find(What:=Cells(i, j).Value, _ after:=ActiveCell, LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, _ SearchDirection:=xlNext) If Not RetRange Is Nothing Then If RetRange.Address <> Cells(i, j).Address Then RetRange.Interior.ColorIndex = 36 Cells(i, j).Interior.ColorIndex = 36 End If Next Next End If ErrorHandler: End Sub

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.6

デバッグ後のコードです Private Sub Worksheet_Change(ByVal Target As Range)   ' 検索先のセル範囲   Dim FindRange As Range   Set FindRange = Worksheets("Sheet4").UsedRange   ' Targetが複数セル場合の対処   Dim rr As Range   For Each rr In Target     ' 空白セルかチェック     If rr.Value = "" Then       ' セル内容を削除した場合の塗りつぶしのリセット       rr.Interior.ColorIndex = xlNone       FindRange.Interior.ColorIndex = xlNone     Else       Dim retRng As Range       ' データの検索       Set retRng = FindRange.Find(rr.Value, after:=FindRange(1, 1), _         LookIn:=xlFormulas, _         LookAt:=xlPart, SearchOrder:=xlByRows, _         SearchDirection:=xlNext)       ' 同一箇所が見つかったかどうかのフラグ       dim bChange as boolean       If Not retRng Is Nothing Then         ' 対象データが見つかった場合         Dim ss As String         ' Doループの脱出条件         ss = retRng.Address(0, 0)         Do           'rr.Interior.ColorIndex = 36           if ss <> retRng.Address(0,0) then             retRng.Interior.ColorIndex = 36             bChange = True           End if           ' 複数同じ記述があるかをチェック           Set retRng = FindRange.FindNext(retRng)         Loop While Not (retRng Is Nothing) And retRng.Address(0, 0) <> ss       End If       ' 変更したセル以外のセルが見つかった場合       if bChange then rr.Interior.ColorIndex = 36     End If   Next End Sub NetFindはタイプミスです 正しくは FindNextです 最初に検索する場合の引数 Afterには Sheet4のデータ入力セルに左上を指示しています

wish21034
質問者

お礼

何度もありがとうございました。 数を重ねていくうちに少しずつわかってきました。 また,これからも力を借りることがあるかもしれませんが 宜しくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

単純な変数のタイプミスです       ss = retRng.Address(0,0) としてください retRangをretRngに変更です エラーになったらそのエラーに対するヘルプなどを参照して ご自身でも解決に向かうように努力しましょう # 検証せずにコードを投稿した私も悪いのですが m(__)m

wish21034
質問者

お礼

ありがとうございます。 何とかヘルプ,インターネットを利用しながら進めています。 NetFindnの箇所がうまく進まず,NextFindに変更してみたのですが・・・ 合っているでしょうか? またセルを変更した後,同じ文字が存在していなくても 背景色が変更してしまします。 私自身でも解決できるよう進めます。 解決方法があれば教えてください!

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

Setが抜けたようです Set retRng = FindRange.Find( rr.value, after:=ActiveCell,

wish21034
質問者

お礼

早急な回答本当にありがとうございます。 ' Doループの脱出条件       ss = retRang.Address(0,0) でオブジェクトが必要です。 という エラーが出てしまいました。 解決方法を御願いします。 今日までに仕上げないといけず混乱していたのですが。 救われました。 ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

初心者であれば質問のようなコードも、止むをえ無いともいえるが、 逆に初心者なら、条件付き書式の操作をして、マクロの記録を採れば、泥臭くなく、エクセルVBAらしいスマートなコードがわかる。 質問のような繰り返しロジックを使う前に、使わないで済む方法はないのか(結構このケースはある)、立ち止まって勉強することが、進歩につながると思う。 また条件付書式と使い方のエクセル固有の勉強も先立って必要であるが。他プログラム言語経験者などは、エクセルの機能の勉強より、コードの作成が優先しがちとおもうが。 同時に勉強してみては。 Sub Macro1() Range("A1:C20").Select Selection.FormatConditions.Delete Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _ "=COUNTIF($A$1:$C$20,A1)>1" Selection.FormatConditions(1).Interior.ColorIndex = 8 End Sub A1:C29の可変化・変動化が課題としてあるが。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ごめんなさい for rr in Target は for each rr in Target でした …

wish21034
質問者

お礼

ありがとうございます! さっそく修正入れました。 ' データの検索     retRng = FindRange.Find( rr.value, after:=ActiveCell,       LookIn:=xlFormulas, _       LookAt:=xlPart, SearchOrder:=xlByRows, _       SearchDirection:=xlNext) 部分でもエラーが出てしまったのですが。 お知恵を拝借したいです。 宜しくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ん? シート4以外のシートでセルの内容が変更された場合 シート4の中に同一の記述があった場合 シート4と現在のシートのセルを黄色にしたい といったことでしょうか? この場合シート4の複数のセルに同じ記述があるのでしょうか? ' 検索先のセル範囲 dim FindRange as Range Set FindRange = WorkSheets("Sheet4").UsedRange ' Targetが複数セル場合の対処 dim rr as range for rr in Target   ' 空白セルかチェック   if rr.value ="" then     rr.interior.colorIndex = xlNone   else     dim retRng as range     ' データの検索     retRng = FindRange.Find( rr.value, after:=ActiveCell,       LookIn:=xlFormulas, _       LookAt:=xlPart, SearchOrder:=xlByRows, _       SearchDirection:=xlNext)     if not retRng is nothing then       ' 対象データが見つかった場合       dim ss as String       ' Doループの脱出条件       ss = retRang.Address(0,0)       do         rr.interior.ColorIndex = 36         retRng.Interior.ColorIndex = 36         ' 複数同じ記述があるかをチェック         set retRng = findRange.NetFind( rr )       Loop while not( retRng is nothing) and retRng.Address(0,0) <> ss     end if   end if next といった具合でしょう …

wish21034
質問者

お礼

さっそくありがとうございます。 とっても心強い解答です。 >シート4の中に同一の記述があった場合 >シート4と現在のシートのセルを黄色にしたい >といったことでしょうか? >この場合シート4の複数のセルに同じ記述があるのでしょうか? 表があるシートがシート4です。 シート4のセルに変更があり,同じ値が存在しているセルの背景を 黄色にしたいのです。 A3に”木村”B6に”木村”D4に”田中”F5に”田中”とあった場合, 木村,田中のセルを黄色に。その他背景はなしです。 さっそく試したとこと >for rr in Target でエラーが出てしまいました。 助言宜しくお願いします。

関連するQ&A

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

  • マクロで色が同じになるように設定したい

    こんにちは。 現在マクロに挑戦中なのですが、一点分からず戸惑っています。 お分かりになる方教えてください。 下記のマクロを書きました。 Sheet2のセルに数字を入れることによってSheet1のセルの色が変わるようにしています。 25以上の数字は全て青(カラー番号5)表示にしたいのですが、どのように記したら良のか教えてください。 --------------------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) Dim iColors As Variant Dim i As Integer Dim j As Integer iColors = Array(36, 20, 24, 37, 40, 39, 17, 22, 45, 43, 28, 6, 4, 41, 18, 47, 50, 46, 10, 7, 3, 21, 9, 5) For Each c In Target If c.Value <> "" Then If IsNumeric(c.Value) Then i = c.Value If i > 0 And i < 25 Then j = iColors(i - 1) Else j = 2 End If End If End If i = c.Row If i > 2 And j > 0 Then Worksheets("Sheet1").Range("B3:K6").Cells(i - 3).Interior.ColorIndex = j End If Next c End Sub --------------------------------------------------------------- お分かりになる方、宜しくお願い致します。

  •  条件付き書式での色付けで以下のコードを教えて頂いたんですが、色付けを

     条件付き書式での色付けで以下のコードを教えて頂いたんですが、色付けを 適用する範囲をどうやって変更すればいいのでしょうか? もしよろしければ、範囲の変更の仕方と、コードの意味を教えて頂けますか? めんどうですがよろしくお願いします・・・。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Columns(3).Interior.ColorIndex = xlNone Dim i, j As Long For i = 1 To Cells(Rows.Count, 3).End(xlUp).Row For j = 1 To Cells(Rows.Count, 6).End(xlUp).Row If Cells(i, 3) = Cells(j, 6) Then Cells(i, 3).Interior.ColorIndex = Cells(j, 7).Interior.ColorIndex End If Next j Next i End Sub

  • VBA どこでもセル選択

    教えて頂いたVBAなのですがもう一つ Sub Macro1() Dim Ws01 As Worksheet Dim Counter As Long, i As Long, j As Long Dim INP As String Set wS = Worksheets("Sheet4") wS.Cells.ClearContents For i = 3 To ActiveSheet.UsedRange.Rows.Count INP = "" For j = Selection(1).Column To Selection(Selection.Count).Column If Cells(i, j) = 1 Then INP = INP & Cells(2, j) & "," End If Next j Counter = Counter + 1 If INP <> "" Then wS.Cells(Counter, "A") = Left(INP, Len(INP) - 1) End If Next i End Sub -------------------------------------------------------------- For i = 3 のところを3としないでどのセル(行)にも対応させたいのですが どうすればいいでしょうか?

  • EXCEL VBA4行毎に枠で囲みたい

    お世話になります。 添付の様な表1があります。 これを表2のようにA1から順に4行毎に枠で囲みたいのです。 下記のようなコードを見よう見まねで書いてみましたがうまく動きません。 ごなたかご教授いただけませんでしょうか? よろしくお願い致します。 Dim i As Long Dim j As Long Dim lngYCnt As Long Dim intXCnt As Long Dim LastRow As Long ingYCnt = Worksheets("Sheet1").UsedRange.Rows.Count intXCnt = Worksheets("Sheet1").UsedRange.Columns.Count LastRow = Cells(Rows.Count, 1).End(xlUp).Row With Selection For i = 5 To LastRow Range("A" & i & ":F" & j).Select Selection.BorderAround Weight:=xlMedium j = j + 5 i = i + 5 Next End With どなたかご教授いただけませんでしょうか? よろしくお願い致します。 環境 EXCEL2003 WINDOWS XP SP3

  • VBA Excel2003 謎のエラー

    いろいろ検索してみたのですが、問題が解決できません。 エクセルのSheet1のA1からG16のセルの内容を一つずつ感知し、マイナスだったら赤、プラスだったら緑、それ以外だったら何もしないという処理にしたいです。 Private Sub Workbook_Open() ThisWorkbook.Sheets("Sheet1").Select ThisWorkbook.Sheets("Sheet1").Range("A1").Select Dim 英語 As Integer Dim 数字 As Integer Dim sheet1 As Worksheets sh1 = Worksheets("Sheet1") sh1.Activate 英語 = 1 数字 = 1 For 数字 = 1 To 16 For 英語 = 1 To 6 '選択位置が、マイナスだったら赤、プラスだったら緑、それ以外は無視 If Range(sh1.Cells(英語 & 数字)) < 0 Then Range(sh1.Cells(英語 & 数字)).Interior.ColorIndex = 7 ElseIf Range(sh1.Cells(英語 & 数字)) > 0 Then Range(sh1.Cells(英語 & 数字)).Interior.ColorIndex = 4 Else Range(sh1.Cells(英語 & 数字)).Interior.ColorIndex = 0 End If 英語 = 英語 + 1 Next 英語 数字 = 数字 + 1 Next 数字 End Sub

  • シート1の氏名をシート2に反映

    sheet1の氏名をsheet2の日付、記号(A,B,C)にマッチした位置に入力させたいのですが下記コードで他で試したのですがうまくいきません。どなたかコードが解る方よろしくお願いします。 Sub 入力() Dim i As Long, j As Long, k As Long, L As Long Dim wS1 As Worksheet, wS2 As Worksheet Set wS1 = Worksheets("Sheet1") Set wS2 = Worksheets("Sheet2") i = wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)) j = wS2.Cells(3, Columns.Count).End(xlToLeft).Column Range(wS2.Cells(3, 2), wS2.Cells(i, j)).ClearContents On Error Resume Next For i = 2 To wS1.Cells(Rows.Count, 4).End(xlUp).Row If WorksheetFunction.CountA(wS1.Rows(i)) > 1 Then For j = 2 To wS1.Cells(i, Columns.Count).End(xlToLeft).Column If wS1.Cells(i, j) <> "" Then k = WorksheetFunction.Match(wS1.Cells(i, 4), wS2.Range(wS2.Cells(6, 1), wS2.Cells(8, 1)), False) L = WorksheetFunction.Match(wS1.Cells(5, j), wS2.Rows(3), False) wS2.Cells(k, L) = wS1.Cells(i, j) End If Next j End If Next i End Sub

  • EXCEL VBA2010 MsgBox

    Sub 重複() Dim i As Long, j As Long For i = 6 To 500 For j = 3 To 3 If WorksheetFunction.CountIf(Range("C6:C500"), Cells(i, j)) > 1 Then Cells(i, j).Interior.ColorIndex = 6 End If Next j Next i End Sub このVBAに重複が何件ありますよというメッセージを出したいです。 MsgBoxの入れ方を教えてください。

  • マクロで塗りつぶしセルのカウント

    マクロ初心者です。アドバイスをお願いします。以下のマクロですとB列の100行目までの塗りつぶしのセルのカウントは出来るのですが、シート上の全てをカウントしたいのです。1TO 100の100の部分をどう変更したら良いのか教えてください。 Sub セルの色数1() Dim I As Integer Dim Count As Integer Count = 0 For I = 1 To 100 If Cells(I, 2).Interior.ColorIndex <> xlNone Then Count = Count + 1 Next I Range("C1").Value = Count End Sub

  • excel vbaについてです

    VBA初心者で、暇な時にいろいろためしています。 以下のマクロを組んだのですが、エラーがでてうまくいきません。 どこがいけないのかご指摘願います。 Sub ather() Dim A As Range Dim B As Range Dim i As Integer With ThisWorkbook.Worksheets("Sheet1") For i = 1 To 30 Set A = Cells(i, 1) Set B = Cells(1, i) If Not .Range(A).Interior.ColorIndex = vbYellow Then GoTo port10 If Not .Range(B).Interior.ColorIndex = vbRed Then GoTo port10 .Range(B).Offset(, 1).Value = "○" port10: Next i End With End Sub イメージとしてはセルの塗りつぶしが黄色で、かつ右隣のセルの塗りつぶしが赤の時に、 赤色セルの右隣のセルに○を表示させようとしているのですが。。。 こうしたらいいんじゃない?といったアドバイスもお願いします(-人-)

専門家に質問してみよう