[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『マクロで2』(みかん)
マクロを実行するのに、W2と同じのが Sheet6のCU2〜CU1350の間にあると 「同じのがあります」とエラーメッセージが出てきて Sheet6のCU2〜CU1350の間に同じのがないと Macro2が実行するにはどうしたらいいですか? (みかん)
ここら辺参考になりませんか?
一例 完全一致の場合、「同じものがあります」
Sub Find_Cell()
Dim F As Range
Set F = Sheets("sheet6").Range("CU2:CU1350").Find( _
what:=Range("W2").Value, _
lookat:=xlWhole)
If Not F Is Nothing Then
MsgBox ("同じものがあります")
Exit Sub
End If
Call Macro2
End Sub
見落とし追加13:31 sheet6
と追記 簡単な質問だけで乱立は良くないと思いますので、最初のスレッドで解決された方が良いと思いますよ。 [[20130521114251]] (稲葉)
稲葉さんのと似てますが。
w2がsheet6ではなく、sheet3のw2だとして。 下記は、同じ値が複数あった場合、その場所をメッセージで出すようになっています。
Sub Sample2()
Dim c As Range
Dim F As Range
Dim r As Range
Dim id As String
id = Sheets("Sheet3").Range("w2").Value
Set c = Sheets("Sheet6").Range("CU2:CU1350").Find(what:=id, lookat:=xlWhole)
If Not c Is Nothing Then
Set F = c
Do
If r Is Nothing Then
Set r = c
Else
Set r = Union(r, c)
End If
Set c = Sheets("Sheet6").Range("CU2:CU1350").FindNext(c)
Loop While c.Address <> F.Address
End If
If r Is Nothing Then
Call Macro2
Else
MsgBox "同じのがあります。" & "場所は" & r.Address(0, 0)
End If
End Sub
(usamiyu)
あと、もし最初のスレッドの回答をこれにも生かすとしたら、ROUGEさんのを参考にして、次のように
アレンジするといいんじゃないかな。
Sub Mikan2()
Dim flg As Boolean
Dim rr As Range
flg = False
For Each rr In Sheets("Sheet6").Range("CU2:CU1350")
If rr.Value = Sheets("Sheet3").Range("w2").Value Then
flg = True
Exit For
End If
Next
If flg Then
MsgBox "同じのがあります"
Else
Call Macro2
End If
End Sub
(usamiyu)
みなさんありがとうございます。 無事できました。
>簡単な質問だけで乱立は良くないと思いますので、最初のスレッドで解決された方が良いと思いますよ。
ほかの事で調べていたら最初の質問と違うのを質問した人がいて、 その方が別で質問した方がいいよ と見たもので別で質問してしまいました。 やはりまとめて質問するべきでしたね 反省してます。
また何かありましたらお願いします。 (みかん)
>ほかの事で調べていたら最初の質問と違うのを質問した人がいて、 >その方が別で質問した方がいいよ
そのような経緯でしたら、こちらの配慮不足です。 どこまでが簡単で、どこまでが難しいかは私が決めることではありませんでした。 申し訳ございません。
老婆心ながら他の質問も見てくださっているとのことですので、次の点も考慮して頂ければ、ありがたいです。
例えばスレッドのタイトル 「マクロで」「マクロで2」 ビジネスメールにも通じるところがありますが、件名で何がしたいのか不明です。
前者ならば「空白の時にマクロでエラーを表示させたい」、 後者ならば「値を検索して、ない時にマクロを実行したい」 など一目見て何がしたいかまとめられると思います。
上記2点から得られる情報から推測すると、登録情報の入力有無と、重複の有無を確認し、Sheet6に 書き込むマクロを作成しようとしているのではないですか?
すると、「入力情報をチェックして、別シートにデータを転記したい」等のタイトルで、1〜10まで 説明すれば誰かしらが回答くれるはずです。
と、くどくなりましたが、覚えておいてくださいね。 (稲葉)
横から失礼します。ムツゴロウといいます。 ちょっとこれの応用で使いたいと思うのですが・・・
値を検索するのが複数ある場合はどうしたらいいのでしょうか? みかんさんの例を借りると、W2〜W100のうち 1つでもCU2〜CU1350の間にあると 同じのがありますとエラーメッセージがでるようにしたいです。
(ムツゴロウ)
こんな感じでどうでしょうか。(ROUGE)
Sub Mutsugoro()
Dim tbl, i As Long, flg As Boolean
With CreateObject("Scripting.Dictionary")
tbl = Range("CU2:CU1350").Value
For i = 1 To UBound(tbl, 1)
.Item(tbl(i, 1)) = Empty
Next
tbl = Range("W2:W100").Value
flg = False
For i = 1 To UBound(tbl, 1)
If .Exists(tbl(i, 1)) Then
flg = True
Exit For
End If
Next
If flg Then
MsgBox "同じものがあります"
End If
End With
End Sub
昨日のをちょっとアレンジしてみました。
Sub Sample4()
Dim c As Range
Dim cc As Range
Dim F As Range
Dim r As Range
Dim id As String
For Each c In Sheets("Sheet3").Range("w2:w100")
Set cc = Sheets("Sheet6").Range("CU2:CU1350").Find(c.Value, lookat:=xlWhole)
If Not cc Is Nothing Then
Set F = cc
Do
If r Is Nothing Then
Set r = cc
Else
Set r = Union(r, cc)
End If
Set cc = Sheets("Sheet6").Range("CU2:CU1350").FindNext(cc)
Loop While cc.Address <> F.Address
End If
Next
If r Is Nothing Then
MsgBox "同じのはありません。"
Else
MsgBox "同じのがあります。" & "場所は" & "Sheet6の" & r.Address(0, 0)
End If
End Sub
(usamiyu)
お二人ともありがとうございます。 マクロはさっぱりでとても勉強になります。
検索する場所が今回はCU2〜CU1350でしたが、 これが2列以上になった場合は 単純にCU2:CU1350を、CU2:CV1350にしただけではだめみたいなんですが 複数列ある場合はどうしたらいいですか?
(ムツゴロウ)
>単純にCU2:CU1350を、CU2:CV1350にしただけではだめみたいなんですが
私のSample4のうち、2箇所あるCU2:CU1350をCU2:CV1350にして試すとだめですか? こちらでのテストでは大丈夫だったんですが・・ 最初提示したときの条件と変えていないので、sheet3のW2:W3を検索値として、 Sheet6のCU2:CV1350を検索しています。
それから、別案で、次のようなのも。
Sub Sample6()
Dim c As Range, r As Range, rr As Range
Dim myCount As Long, t As Long
Set r = Sheets("Sheet3").Range("w2:w100")
Set rr = Sheets("Sheet6").Range("CU2:CV1350")
For Each c In r
myCount = WorksheetFunction.CountIf(rr, c.Value)
If myCount > 0 Then
t = t + myCount
End If
Next
If Len(t) > 0 Then
MsgBox "同じのがあります"
Else
MsgBox "同じのはありません"
End If
End Sub
(usamiyu)
カウンタによるループからFor Eachループに変更すればOKです。(ROUGE)
すいません。 なぜかうまくいきません。 ちなみに私の場所はKB1:KB90で 同じのがあるか見る場所はGK7:JV1007です。 シートはどちらもSheet4です。 これに変更してるだけなのですが・・・
ROUGEさん >カウンタによるループからFor Eachループに変更すればOKです。 すいません。私はあまりマクロには詳しくなくて、いつも マクロの記録でしか作れなくて、何処をどういう風にすればいいかわかりませんん。
(ムツゴロウ)
>ちなみに私の場所はKB1:KB90で同じのがあるか見る場所はGK7:JV1007です。
ということはVerは2007以降ですね。2010でテストしてみましたが、当方ではできるんですよねぇ。なんでだろう。
>なぜかうまくいきません。 というのはどういうことですか? たとえばエラーが出て止まるとか、又は、期待した結果と違ってこうなってしまうとか。
sample4(対象範囲がCU2:CU1350だったときのコード)では、うまくいきましたか?
コードはどこにコピペしていますか?標準モジュール?
(usamiyu)
エクセル2010です コードは標準モジュールのModule2です。 同じものがあるのに、同じのはありません。とでてしまいます。
ちなみに=EXACT(GR7,KB1)でみたらTRUEがかえるので同じなはずです。
sample4でもう一度試しましたがやはり同じものがあるのに、同じのはありません。とでてしまいます。 sample6は同じものがなくても同じのがありますとでてしまいます。
よろしくお願いします。
(ムツゴロウ)
うーん。とりあえず、つぎので試してもらえますか
Sub Sample7()
Dim c As Range
Dim cc As Range
Dim F As Range
Dim r As Range
With Sheets("Sheet4")
For Each c In .Range("KB1:KB90")
Set cc = .Range("GK7:JV1007").Find(c.Value, LookIn:=xlValues, lookat:=xlWhole, searchformat:=True)
If Not cc Is Nothing Then
Set F = cc
Do
If r Is Nothing Then
Set r = cc
Else
Set r = Union(r, cc)
End If
Set cc = .Range("GK7:JV1007").FindNext(cc)
Loop While cc.Address <> F.Address
End If
Next
If r Is Nothing Then
MsgBox "同じのはありません。"
Else
MsgBox "同じのがあります。" & "場所は" & r.Address(0, 0)
End If
End With
End Sub
それと、ごめんなさい。sample6は間違えてましたm(__)m >If Len(t) > 0 Then これを次のように差し替えて、こっちも試してもらえますか? If t > 0 Then
(usamiyu)
こんな感じです。(ROUGE)
Sub Mutsugoro()
Dim tbl, x, i As Long, flg As Boolean
With CreateObject("Scripting.Dictionary")
tbl = Range("CU2:CU1350").Value
For Each x In tbl
.Item(x) = Empty
Next
tbl = Range("W2:W100").Value
flg = False
For x In tbl
If .Exists(x) Then
flg = True
Exit For
End If
Next
If flg Then
MsgBox "同じものがあります"
End If
End With
End Sub
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.