• ベストアンサー

下記のマクロは

E列の5行目から2000行までの間で 鉄、銅、銀、空白以外の文字が入っていたら 『鉱1_Click』という別のマクロを行うというマクロなのですが、 『銀』に限ってはE列5行目~2000行の間に1つだけあっても 『鉱1_Click』を走らせるようにしたいのですが、 どのように改造すればできると思いますか? E列5行目~2000行の間に『銀』に限っては2つ以上でないと作動しないという風にしたいのです。 E列5行目~2000行の間に鉄、銅、空白、銀(1つ)の状態では発動しないようにしたいです。 当たり前ですが今現在ですと、銀がなかったり1つでも作動してしまいます。 Private Sub 鉱_Click() Dim ColumnA Dim flg As Boolean flg = False ColumnA = Columns("E:E") For i = 5 To 2000 If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "銀" Or ColumnA(i, 1) = "" Then Else flg = True Exit For End If Next If flg Then 鉱1_Click Else End If End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.3

'発動する条件が明確ではないので、とりあえず、以下のようにチェックしました。 '理解した条件に間違いがあれば、コメント「←部分」を修正してくださいね。 Private Sub 鉱_Click3()   Dim ColumnA   Dim wCnt1    As Integer   Dim wCnt2    As Integer   '   ColumnA = Range("E1:E2000")   wCnt1 = 0: wCnt2 = 0   For i = 5 To 2000     If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "" Then       wCnt1 = 1     End If     If ColumnA(i, 1) = "銀" Then       wCnt2 = wCnt2 + 1     End If   Next   '   If wCnt2 > 1 Then     '(1)銀が2以上の場合、発動する     Call 鉱1_Click   ElseIf wCnt1 = 1 Or wCnt2 = 1 Then   '←以下の条件に間違いがある場合はここを修正すればいいですよ     '(1)「鉄」又は「銅」又は「""」 が一つでもあれば、発動しない     '(2)銀が一つある場合は、発動しない   Else     Call 鉱1_Click   End If End Sub

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

こんな感じでもできそうですが… Private Sub 鉱_Click() Dim cnt,i As Integer  For i = 5 To 2000   If Cells(i, "E") = "鉄" Or Cells(i, "E") = "銅" Then   Else    If Cells(i, "E") = "銀" Then     cnt = cnt + 1     If cnt > 1 Then      Exit Sub     End If    Else     Exit Sub    End If   End If  Next  Call 鉱1_Click End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • nekotaru
  • ベストアンサー率50% (22/44)
回答No.1

>『銀』に限ってはE列5行目~2000行の間に1つだけあっても >『鉱1_Click』を走らせるようにしたいのですが、 と >E列5行目~2000行の間に『銀』に限っては2つ以上でないと作動しないという風にしたいのです。 は、矛盾してませんか? 2つ別々に実現するのでしょうか? とりあえず、 >E列5行目~2000行の間に『銀』に限っては2つ以上でないと作動しないという風にしたいのです。 の実現は下記でどうでしょうか? いま手元にEXCELがないので、動作確認はできてません。 Private Sub 鉱_Click() Dim ColumnA Dim flg As Boolean dim flg_gin as Boolean flg_gin = False flg = False ColumnA = Columns("E:E") For i = 5 To 2000 if ColumnA(i, 1) = "銀" Then if flg_gin = True then flg = True Exit For else flg_gin = True End If End If If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "" Then Else flg = True Exit For End If Next If flg Then 鉱1_Click Else End If End Sub

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 下記のマクロは

    E列の5行目から2000行までの間で 鉄、銅、銀、空白以外の文字が入っていたら 『鉱1_Click』という別のマクロを行うというマクロなのですが、 『銀』に限ってはE列5行目~2000行の間に1つだけあっても 『鉱1_Click』を走らせるようにしたいのですが、 どのように改造すればできると思いますか? Private Sub 鉱_Click() Dim ColumnA Dim flg As Boolean flg = False ColumnA = Columns("E:E") For i = 5 To 2000 If ColumnA(i, 1) = "鉄" Or ColumnA(i, 1) = "銅" Or ColumnA(i, 1) = "銀" Or ColumnA(i, 1) = "" Then Else flg = True Exit For End If Next If flg Then 鉱1_Click Else End If End Sub

  • 素数を求めるマクロを

    走らすと暴走したようになり、素数=151で止まります。 どこが悪いのでしょうか。正常に終わるようにしたいです。 ====================== Sub 素数を求める()   Dim i As Long   Dim j As Long   Dim m As Long   Dim p As Long   Dim flg As Boolean   i = 1   j = 1   p = 2   Do     flg = False     For m = 2 To Int(Sqr(p))       If p Mod m = 0 Then         flg = True         Exit For       End If     Next     If flg = False Then       Cells(i, j) = p       i = i + 1       If i > Rows.Count Then         i = 1         j = j + 1       End If     End If     p = p + 1   Loop End Sub ======================

  • 下記のマクロをもっと早くするには?

    下記のマクロは、 A列にあるURLがSSL化(https)されているかを調べるものです。 このマクロを動かすと、大体3秒に1つのURLを調べるくらいの早さです。 もっと早く調べられるようにするには、どのような記述にすればできるでしょうか? また、エクセルの他の設定で、マクロを早くできたりしますか? よろしくお願いいたします。 Sub SSL() Dim objHttp As Object Dim nURL As String Dim strURL As String Dim i As Long, f As String, l As String Dim Lastrow As Long, getLine As Long Set objHttp = CreateObject("WinHttp.WinHttpRequest.5.1") On Error GoTo ErrHandler 'A1から getLine = Cells(Rows.Count, 2).End(xlUp).Row Lastrow = Cells(Rows.Count, 1).End(xlUp).Row If getLine = Lastrow Then MsgBox "既に終わっているか、データがないです。", vbExclamation: Exit Sub If getLine < Lastrow And Cells(1, 2).Value <> "" Then getLine = getLine + 1 Else getLine = 1 '最初の行が1行目からの場合 End If For i = getLine To Lastrow strURL = LCase(Trim(Cells(i, 1).Value)) 'A列の登録URL strURL = Replace(strURL, "https:", "http:") If strURL Like "http*" Then objHttp.Open "GET", strURL, False objHttp.send DoEvents 'ESC割り込み可能にする With objHttp If .Status = 200 Then nURL = .Option(1) 'WinHttpRequestOption_URL f = Mid(strURL, 1, InStr(strURL, "://")) l = Mid(nURL, 1, InStr(nURL, "://")) If nURL = "" Then Cells(i, 2).Value = "no URL" ElseIf nURL <> "" Then If LCase(f) = LCase(l) Then Cells(i, 2).Value = "non SSL" Else Cells(i, 2).Value = "https" End If End If Else Cells(i, 2).Value = "Err:" & .Status End If End With End If Endline: nURL = "" strURL = "" Next i MsgBox "Finished" Exit Sub ErrHandler: If Err() <> 0 Then Cells(i, 2).Value = Err.Number 'マイナスになるのは外部エラー GoTo Endline End If End Sub

  • 以下のマクロは、一応簡単な文字チェックマクロなのですが・・・

    L列の5行目から文字の入っている最後の行の範囲で、 L列に『等』という文字が入っているセルで M列に『トウ』の文字が入っていない場合は、MsgBoxを出すというマクロです。 Private Sub 等_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "L").End(xlUp).Row '『i』はD列の5行目から文字の入っている最後の行をいう(行の範囲) If InStr(.Cells(i, "L"), "等") > 0 Then If InStr(.Cells(i, "M"), "トウ") = 0 And .Cells(i, "M") <> "" Then MsgBox i & "行" End If End If Next i End With End Sub これに少し付け加えて、 L列に『等』が2回出てきたら、M列は『トウ』を2回出てこないとMsgBoxを出すようにしたいのですが、どのようにすればよいでしょうか? 例えば L列7行目 柑橘類等や野菜類等 M列7行目 カンキツルイトイヤヤサイルイトウ ※ ひとつ目の『等』のヨミが『トイ』となっていますが、上記のマクロですと ヨミの最後の『トウ』に反応してスルーしてしまいます。 完璧なヨミチェックはマクロでは無理かと思いますが、このくらいはスルーしないマクロを何とかゲットしたいです。。。

  • 下記のマクロはC列5行目から文字の

    下記のマクロはC列5行目から文字の入っている最後の行までの範囲で セル内に蜜柑や林檎、苺の文字が入っていたら同一行のA列にも蜜、林、苺 の文字を入れるというマクロなのですが・・・ たとえばC列12行目が 『蜜柑林檎苺』 となっていた場合、A列に入る言葉は『苺』となり『蜜』『林』という言葉が 消えてしまいます。 そこでこのマクロを少し改造して、 C列が『蜜柑林檎苺』や『蜜柑苺』となっている場合 A列に入る言葉は『蜜林苺』ないし『蜜苺』という風に積み重ねていくように改造はできないでしょうか? ↓この部分を改造すればできるようになりますか? Cells(i, 2).Offset(0, -1).Value = "蜜" Sub 蜜柑林檎苺() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "蜜柑") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "蜜" End If If InStr(.Cells(i, "C"), "林檎") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "林" End If If InStr(.Cells(i, "C"), "苺") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "苺" End If Next i End With End Sub

  • いま以下のコードでA列のデータから1を探してその

    1つ前と2つ前のB列の値をC.D列に出力することができるのですが、この時のデータ数を知りたいのですがどうすればいいでしょうか? Sub sample() Dim i As Long, j As Long, flg As Boolean For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 1) = 0 Then flg = True ElseIf Cells(i, 1) = 1 And flg = True Then j = j + 1 Cells(j, "BT") = Cells(i - 1, "BS") Cells(j, "BU") = Cells(i - 2, "BS") flg = False Else: flg = False End If Next End Sub これでC1とD2に対応するB?とB?の間のデータ数がE1に、C2とD3に対応するB?とB?の間のデータ数がE2にC3と・・・ という具合です。 わかりにくくてすみません。よろしくお願いします。

  • マクロdictionaryオブジェクト書き換え

    ここで教えていただいたマクロを   シート1のF列を検索値として   シート2のA列を検索しヒットしたら   シート2の該当行のD列をシート1のAE列に転記。   データの2列目から行う。ヒットしない場合は 無 と転記。 と変更したくて記述を書き換えたらシート1が壊れてしまいました。 正しい記述を教えてください。 ↓教えていただいた書き換え前の正常動作する記述↓ Sub 検索() 'dictionaryオブジェクトを使用 'シート1のA列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のE列をシート1のC列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定E列 With .Range("E2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (5)=E列 w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 A列 With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定 Offset(, 2)=検索値のA列より右2つ→C列 With .Offset(, 2) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub ---- ↓書き換えておかしな動きになった物 ●の部分を変更しました↓ Sub 検索02() 'dictionaryオブジェクトを使用 'シート1のF列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のD列をシート1のAE列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定D列● With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (4)=D列● w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 F列● With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定  'Offset(, 25)=検索値のA列より右25個→AE列● With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • 繰り返しマクロについて

    先日、マクロについて質問をさせていただきました。 常に右側の列と左側の列のデータを比較して、右側の列のデータが多ければ「↑」マークを、同じなら「―」マークを、少なければ「↓」マークを表示させたいのです。 最初にデータを入れる列はD列7行目から30行目まで。次はE列に同じようににデータ入力した後ににマクロを実行します。これをM列7行目から30行目まで、列に新しいデータを入れるたびに毎回繰り返したいのです。 矢印マークは 常にN列に表示。  で、以下のようなマクロを教えていただきましたが、このマクロだと 比較がされる列が、絶えずD列と、新しく入力した列になってしまいます。 先ほども書きましたが、比較する列は、D列とE列 それが終わったらE列とF列 次はF列とG列 というように常に右側とその直ぐ左側の列の比較をしたいのです。 もう一度 お教えいただきたいのですが、よろしくお願いいたします。 回答いただいたマクロを下に入れておきます。 Sub test() Dim i, j, k As Long Dim vl1, vl2 As Variant For i = 4 To 30 If WorksheetFunction.Count(Range(Cells(i, 4), Cells(i, 13))) > 1 Then j = 4 Do Until Cells(i, j) <> "" j = j + 1 Loop vl1 = Cells(i, j) For k = 4 To 13 If Cells(i, k) <> "" Then vl2 = Cells(i, k) End If Next k If vl1 > vl2 Then Cells(i, 14) = "↓" ElseIf vl1 = vl2 Then Cells(i, 14) = "→" Else Cells(i, 14) = "↑" End If Else Cells(i, 14) = "" End If Next i End Sub

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 行ごとに判定するマクロについて教えて下さい

    行ごとに判定するマクロについて教えて下さい。 下記のようなマクロで、添付ファイルのように、行ごとで E列からN列で違った数値がないか、入力されていないセルがないかを調べ 4つすべてのセルが同じ数値でない場合は塗りつぶしはされず O列にOKを表示しないようなマクロを組みたいのですが 現在のマクロだと、行ごとではなく、E3~N102セルまでの中で 同じ数値がないかを判断してしまっているため K11セルやK15セルのように数値が入力されていないにも関わらずO列の部分にOKが出てしまいます。 他の行に同じ数値が入っているのは関係なしにして 11行目なら11行目だけで 15行目なら15行目だけで、というように行ごに判定していくには どのようにすればいいでしょうか? Sub 判定マクロ回転() Dim i As Integer, j As Integer Range(Cells(3, 15), Cells(102, 15)).ClearContents For i = 3 To 102 For j = 5 To 14 Cells(i, j).Interior.ColorIndex = 0 If WorksheetFunction.CountIf(Range("E3:N102"), Cells(i, j)) > 3 Then If Cells(i, j).Row Mod 2 = 1 Then Cells(i, j).Interior.ColorIndex = 6 Cells(i, 15) = "OK" Else If Cells(i, j).Row Mod 2 = 0 Then Cells(i, j).Interior.ColorIndex = 40 Cells(i, 15) = "OK" End If End If End If Next j Next i If WorksheetFunction.CountIf(Range("O3:O102"), "OK") > 99 Then MsgBox "データチェックOK(^O^)b" End If End Sub

印刷できない原因と対策
このQ&Aのポイント
  • 突然印刷ができなくなった場合、ブラザー製品のMFC-J6570CDW LANをご使用の方は以下の要点に注意してください。パソコンのOSはWindows10で、有線LAN接続を使用しています。印刷できない原因や対策について詳しく説明します。
  • 「MFC-J6570CDW LAN」を使用していて、突然印刷できなくなった場合、Windows10のパソコンを有線LAN接続で使用していることを確認してください。その上で、印刷できない原因が何であるかを特定し、対策を行ってください。
  • ブラザー製品のMFC-J6570CDW LANをご使用の場合、突然印刷ができなくなることがあります。Windows10のパソコンを使用していて、有線LANで接続している場合、以下の対策を試してみてください。印刷できない原因や対策について詳しく解説します。
回答を見る

専門家に質問してみよう