[[20150129171719]] 『Do Loopについて』(あす) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『Do Loopについて』(あす)

G列で**ASSYと表示されなくなるまで処理をするマクロを作っています。
下記のように作ったのですが1回目しか処理されません。
よろしくお願いします。

Sub test()
Dim i As Long
i = 2

   Do
    k = Right(Range("G" & i).Value, 4)
    Range("D" & i).Value = 1
    i = i + 1
   Loop While k <> "ASSY"
End Sub

< 使用 Excel:Excel2010、使用 OS:Windows7 >


 whileは条件を満たす限りループする(条件を満たさなかったら抜ける)ものですから、

 × Loop While k <> "ASSY"
 ○ Loop While k = "ASSY"

 のようにしましょう。もしくは Loop Until k <> "ASSY" で。
(Jera) 2015/01/29(木) 17:34

G2がASSYであった場合1回しか機能しません

少し危険なのでこのやり方を変えた方がいいです。

もしG列にASSYがなかった場合止めることができません
今のマクロだとG列がASSYのところまでD列に1が入るだけのマクロです
G列の一番下の行まで処理をするという条件に変えた方がいいです

    **ASSYと表示されなくなるまで処理をする 

とはどのようなことをやりたいのでしょうか

一番後ろがASSYのデータをすべて削除するのでしょうか

(デイト) 2015/01/29(木) 17:41


デイト様
一番初めに**ASSY表示されるまでのセルの数が知りたいのです。
ASSYは別の行にもあり、いくつあるか都度変わるので、最終行まで処理するとセルの数がわからなくなるからです。
何かいい方法ありますか

(あす) 2015/01/29(木) 17:49


 Sub test2()
    Dim c As Range

    With Range("G2", Range("G" & Rows.Count).End(xlUp))
        Set c = .Cells.Find(What:="*ASSY", After:=.Cells(1).Offset(.Rows.Count - 1), LookIn:=xlFormulas, LookAt:=xlWhole)
    End With

    If c Is Nothing Then
        MsgBox "みつかりません"
    Else
        MsgBox "最初のASSY君は" & c.Row & "行目にいましたよ"
    End If

 End Sub

(β) 2015/01/29(木) 18:12


DO LOOPで最終行まで行ったら終了させる

Sub Macro1()

Dim i As Long
Dim MaxRow As Long
Dim k As String
Dim count As Long
MaxRow = Range("G" & Rows.count).End(xlUp).Row
i = 2

Do

    k = Right(Range("G" & i).Value, 4)

        If i = MaxRow Then
            count = 0
            Exit Do
        End If
     i = i + 1
count = count + 1

Loop While k <> "ASSY"

Range("G1").Value = count

End Sub

(デイト) 2015/01/29(木) 18:22


デイト様 β様
すみません。
一番初めに**ASSY表示されるまでのセルの数が知りたいのです。
と書きましたが間違えです。
G2からスタートして一番初めに**ASSY表示されなくなるまでのセルの数が知りたいのです。
よろしくお願いします。

(あす) 2015/01/29(木) 18:31


 じゃぁ、ふつうに

 Sub Test3()
    Dim c As Range

    For Each c In Range("G2", Range("G" & Rows.Count).End(xlUp))
        If Right(c.Value, 4) <> "ASSY" Then Exit For
    Next

    If c Is Nothing Then
        MsgBox "すべてASSY君でした"
    Else
        MsgBox "ASSY君じゃなくなるまでのセルの数は " & c.Row - 2 & " 個でしたよ"
    End If

 End Sub

(β) 2015/01/29(木) 18:50


 それなら最初の回答のiの数でいいと思いますが…
 G列に途中空白があっても1セルとしてカウントしていいなら、こんなのでも
 MsgBox Evaluate("max((right(g1:g10000,4)=""ABSS"")*row(1:10000))")
(Jera) 2015/01/29(木) 19:03

 失礼します。
 Jeraさんの式、ABSS はASSY だとして、最後のASSYが現れる行になりますよね。
 テーマとしては、「最初にASSYじゃなくなるセル」ですから、たとえば、

 abcdASSY
 zzzzASSY
 xyz
 1234ASSY
 '
 '
 こんな順番だとしたら、xyz が求めるセルでは?
 もし、ASSYじゃなくなったら、もうASSYは以降あらわれないのであれば、この式でいいわけですけど。

(β) 2015/01/29(木) 19:32


 ↑のコメントをアップしてふと。

 たとえば、

 ' ASSY じゃない (1)
 ' ASSY じゃない
 ' ASSY じゃない
 ' ASSY
 ' ASSY
 ' ASSY
 ' ASSY じゃない (2)
 ' ASSY じゃない
 ' ASSY じゃない

 こんな順番だったとして、(あす)さんの求める、ASSYじゃなくなったセルが (2) だとすると、私のコードは
 だめですねぇ。私のコードは (1) が、ASSYじゃなくなったセルだと認識しますから。

 で、この場合(上記の下に、二度とASSYが現れないという仕様なら)Jeraさん式でOKということになりますね。

 ところで、上記のようなことだったとして、(あす)さんの求めるセル数は 3 でしょうか、6 でしょうか?

(β) 2015/01/29(木) 19:42


 もし、ASSY群がひと塊で出現するということなら、Jeraさんの一発コードでできるし、
 これは、マクロじゃなくても、この数式をセルに書いて Ctrl/Shift/Enter で入力してもできますね。

 なんだけど、乗り掛かった舟(?)で、

 Sub Test4()
    Dim c As Range

    With Range("G2", Range("G" & Rows.Count).End(xlUp))
        Set c = .Cells.Find(What:="*ASSY", After:=.Cells(1), LookIn:=xlFormulas, LookAt:=xlWhole, SearchDirection:=xlPrevious)
    End With

    If c Is Nothing Then
        MsgBox "みつかりません"
    Else
        MsgBox "最後のASSY君は" & c.Row & "行目にいましたよ"
    End If

 End Sub

(β) 2015/01/29(木) 19:59


β様
(1)がASSYじゃなくなるセルです。
色々ありがとうございました。

(あす) 2015/01/29(木) 20:23


 あー勘違いしてました。すいません^^;
 解決済ですし、Findのほうが適していると思いますが一応evaluateの修正案も出しておきます。
 MsgBox [min((right(g1:g10000,4)="ASSY")*10^6+row(1:10000))-1]

 (何でABBSが出てきたんだろう)
(Jera) 2015/01/29(木) 23:02

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.