[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
少し危険なのでこのやり方を変えた方がいいです。
もしG列にASSYがなかった場合止めることができません
今のマクロだとG列がASSYのところまでD列に1が入るだけのマクロです
G列の一番下の行まで処理をするという条件に変えた方がいいです
**ASSYと表示されなくなるまで処理をする
とはどのようなことをやりたいのでしょうか
一番後ろがASSYのデータをすべて削除するのでしょうか
(デイト) 2015/01/29(木) 17:41
(あす) 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
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
(あす) 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
(あす) 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.