- ベストアンサー
Excel VBAのループ処理で特定の回のみスキップする方法
cj_moverの回答
- cj_mover
- ベストアンサー率76% (292/381)
あー、例を挙げるなら、こんな感じの方が親切でしたか? ' ' ================================== Option Explicit Private basedata(0 To 10) As String ' baseData(0) は testNo 用に予め確保 Private testno As String Private weight(1 To 16) As Double Private weightA(1 To 6) As Double Private weightB(7 To 12) As Double Private printRow As Long Private testrow As Long Private i As Long Private flgEsc As Boolean Sub Main8074402() ' 関連QA 8072449 Sheets("sh3").Select ' ◆シート名◆ Range("A3:AA17").ClearContents For printRow = 3 To 17 testno = Trim(Cells(printRow + 20, "B")) If testno <> "" Then flgEsc = False SubBase If Not flgEsc Then SubWeight If Not flgEsc Then SubPrint End If End If Erase basedata, weight, weightA, weightB End If Next printRow End Sub Private Sub SubBase() With Sheets("sh1") ' ◆シート名◆ For testrow = .Cells(65536, 1).End(xlUp).Row To 6 Step -1 If CStr(.Cells(testrow, 1)) = testno Then Exit For Next testrow If testrow < 6 Then flgEsc = True Exit Sub End If For i = 1 To 10 basedata(i) = .Cells(testrow, i + 1) Next i End With End Sub Private Sub SubWeight() With Sheets("sh2") ' ◆シート名◆ For testrow = .Cells(65536, 1).End(xlUp).Row To 6 Step -1 If CStr(.Cells(testrow, 1)) = testno Then Exit For Next testrow If testrow < 6 Then flgEsc = True Exit Sub End If For i = 1 To 6 weight(i) = .Cells(testrow, i + 1) weightA(i) = weight(i) Next i For i = 7 To 12 weight(i) = .Cells(testrow, i + 2) weightB(i) = weight(i) Next i End With End Sub Private Sub SubPrint() basedata(0) = testno Cells(printRow, 1).Resize(, 11).Value = basedata weight(13) = Application.Max(weightA) weight(14) = Application.Min(weightA) weight(15) = Application.Max(weightB) weight(16) = Application.Min(weightB) Cells(printRow, 12).Resize(, 16).Value = weight End Sub ' ' ================================== んで、Exit Sub すれば With節の途中であってもオブジェクトアクセスは解放されますから。 (勿論インスタンスは別問題ですが、Sheetの場合は関係ないですね。) モジュールで宣言した(Staticな)オベジェクト型変数を使う場合とかは 面倒みなくちゃいけませんけど、通常はメインProc.で解放するってことで。
関連するQ&A
- ループが走りません
Sub COIN() Dim shSAI As Worksheet Dim shTAN As Worksheet Dim inROW As Long Set shSAI = Sheets("最終") Set shTAN = Sheets("単価") For inROW = 10 To shSAI.UsedRange.Rows.Count If shTAN.Range("C" & inROW) = shTAN.Range("C4") Then shSAI.Range("G" & inROW).Value = shSAI.Range("G6").Value End If Next Set shSAI = Nothing Set shTAN = Nothing End Sub 上記のようなコードを書きました 動作としては「最終」シートC10から下へ続く文字に対し、「単価」シートC4と同一であれば、 「最終」シートG10から下へ続くG列に、「単価」シートG6の数値をあてはめたいと考えております。 「最終」シートのC列は、場合によっては下に続くため、C10から始まり最終行までの検索するループを作りたいのですが、ループが走りません。 当方全くの素人でありますが、問題点がお分かりの方がおりましたら、教えて下さい。
- ベストアンサー
- Visual Basic
- VBA ループ処理 "型が違います"エラー
"sheet1"のA1:J1を"sheet2"のA1:J1にコピー "sheet1"のA2:J2を"sheet2"のA2:J2にコピー "sheet1"のA3:J3を"sheet2"のA3:J3にコピー これを"sheet1"A:Jが空欄になるまでループさせたいのですが、 どうしてもエラーが出てしまいます。。。 前回も同様の質問をして、回答を頂いたのですが、 自分なりに応用を利かせてやってみたら、エラーが出てしまいます>< ------------------------------------------------------------ Sub cpy2() Dim i As Long Dim Sht1 As Range Dim Sht2 As Range Set Sht1 = Sheets("Sheet1").Range("A1:J1") ←("A1")ではエラーは出ません。 Set Sht2 = Sheets("Sheet2").Range("A1:J1") ←("A1")ではエラーは出ません。 For i = 0 To 65535 If Sht1.Offset(i) <> "" Then ←ここでエラーが出ます"型が違います" Sht2.Offset(i) = Sht1.Offset(i) Else Exit For End If Next End Sub -------------------------------------------------------------- 教えて下さい。お願いします。
- ベストアンサー
- Visual Basic
- Excel2010 VBA 条件色付け
Sub sample() Dim r As Range For Each r In Range("q6:q30") If myIsNumeric(r) Then r.Offset(0, 1).Value = "数字" Else r.Offset(0, 1).Value = "文字" End If Next End Sub Function myIsNumeric(Target As Range) Dim r As Range Dim buf, tmp Dim flg As Boolean Dim i As Integer buf = Target For i = 1 To Len(buf) tmp = Mid(buf, i, 1) If IsNumeric(tmp) Then flg = True Exit For End If Next myIsNumeric = flg End Function を数字が入ってたら塗りつぶさないで、 数字が入ってなかったら塗りつぶすように直したいです。 あああ→塗る あああ1-1→塗らない 住所→塗る 住所12→塗らない
- ベストアンサー
- Excel(エクセル)
- Excel VBA 指定シートの有無確認
指定した名前のシートがあるかないか判断させてますが、 以下のやりかたでは、 グラフ作成したシートを認識してくれません。 そのようにすれば良いでしょうか? Dim ws As Worksheet, flag As Boolean For Each ws In Worksheets If ws.Name = "シート" Then flag = True Next ws If flag = True Then msgbox "あります Else Sheets.Add ActiveSheet.Name = "シート" End If
- ベストアンサー
- Visual Basic
- ExcelVBAの知恵をお貸しください。
一つのシートで、複数のセル範囲を選択している場合に、セル範囲を選択しているのか?列、行を選択しているのかを判別する方法として次のようなのを考えました。 それとなく動いているのですが、なんとなくスマートでなく、場当たり的な感じがしますが、どのようにすればいいのか判りません!! どなたか、アドバイス頂けないでしょうか?宜しくお願いいたします。 Sub test() Dim myRang As Range Dim myArry As Variant For Each myRang In Selection.Areas myArry = Split(Replace(myRang.Address, ":", ""), "$") If UBound(myArry) <> 2 Then MsgBox "セル範囲を選択しています。" & myRang.Address Else If IsNumeric(myArry(1)) Then MsgBox "行を選択しています。" & myRang.Address Else MsgBox "列を選択しています。" & myRang.Address End If End If Next End Sub
- ベストアンサー
- オフィス系ソフト
- エクセル 転記ループが上手くいきません
シート2のA列の数値と、シート3のA列の数値が一致したら、シート2のB列の数値をシート3のB列に転記したいです。(実際はもうちょっと複雑ですが・・) 実際はデータ量があるため、処理時間を少なくしたくて、配列に挑戦してみました。 処理は最後まで行くのですが、転記がされません。 どうしてでしょうか?? どなたか教えてください!!! Sub sample2() Dim i As Long Dim ii As Long Dim last As Long Dim last2 As Long Dim MyArray1 Dim MyArray2 last = Sheets("sheet2").Cells(Rows.Count, 1).End(xlUp).Row last2 = Sheets("sheet3").Cells(Rows.Count, 1).End(xlUp).Row MyArray1 = Sheets("sheet2").Range("A1:B" & last) MyArray2 = Sheets("sheet3").Range("A1:B" & last2) For i = LBound(MyArray1, 1) To UBound(MyArray1, 1) For ii = LBound(MyArray2, 1) To UBound(MyArray2, 1) If MyArray1(i, 1) = MyArray2(ii, 1) Then MyArray2(ii, 2) = MyArray1(i, 2) End If Next Next End Sub
- ベストアンサー
- Excel(エクセル)
- ExcelVBA 非連続域の扱い(01)
お世話になります。 添付映像の、ような 非連続域の、扱いに 困って、います 下記に、記載の コードに、おいて 2回目、以降に Function 最小値域(… に、 制御が、回た 際の >フィールド.Rows.Count が、 1に、成り 困って、います。 と、言うか 抑も、 非連続域の、扱い方が 全く 解って、いません どう、取得し、 どう、扱い、 どう、指定し、 どう、渡す、 のか… 等、 なので >Evaluate("MIN(" & フィ… や、 >For Each カウンター In フィールド.Range(Cells(… 等の、 Range指定、等も 間違えて、いる と、思います 其処で、 非連続域の、扱い に、ついて どうぞ、ご指南を 宜しく、お願いします。 記 Option Base 1 Option Explicit Type ランゲポイント形式 左 As Long 右 As Long 上 As Long 下 As Long End Type Function 最小値域(ByVal フィールド As Range, ByVal 列 As Long, Optional ByVal 指標値 As Variant) As Range Dim ポイント As ランゲポイント形式, ランゲ As Range, カウンター As Range, 注目行 As Long Let ポイント.上 = 1 Let ポイント.左 = 1 Let ポイント.下 = フィールド.Rows.Count Let ポイント.右 = フィールド.Columns.Count Set ランゲ = Nothing Set カウンター = Nothing If IsMissing(指標値) _ Then Set 指標値 = Evaluate("MIN(" & フィールド.Range(Cells(列, ポイント.上), Cells(列, ポイント.下)).Value & ")") End If For Each カウンター In フィールド.Range(Cells(列, ポイント.上), Cells(列, ポイント.下)) If カウンター.Value = 指標値 _ Then Let 注目行 = カウンター.Row If ランゲ Is Nothing _ Then Set ランゲ = フィールド.Range(Cells(注目行, ポイント.左), Cells(注目行, ポイント.右)) Else Set ランゲ = Union(ランゲ, フィールド.Range(Cells(注目行, ポイント.左), Cells(注目行, ポイント.右))) End If End If Next Set 最小値域 = ランゲ End Function Sub main() Dim ダミー As Range Set ダミー = 最小値域(最小値域(最小値域(Range("sheet2!B2:e9"), 2, "A"), 3), 4) End Sub 以上
- ベストアンサー
- Excel(エクセル)
- Forループの制御について
VB 2005,Framework2.0を使用しています。 For文を使ったループについてお尋ねしたいことがあります。 For i As Integer = 0 To 10 ’処理 Next i とあったとします。 そうするとループ変数iが0から10になるまで連続してループを行うのですが、これをある条件の時に現在のループ変数から一つ飛ばして次のループからまた処理を行いたい場合どのようにすれば良いのでしょうか? 例えば0~10回中に、現在5回目で特定の条件が一致したときその次の6回目のループは飛ばして7回目のループから再開したいです。 ちなみにこの様に書いても0から10回必ずループされてしまいました。 Dim TEST(10) As Integer TEST(5) = 1 For i As Integer = 0 To 10 If TEST(i) = 1 Then i = i + 1 End If Next i
- ベストアンサー
- Visual Basic
- ExcelVBA データのコピー範囲について
あけましておめでとうございます。今年もよろしくお願いします。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _ Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget Set f = Sheets("Sheet2").Columns(1). _ Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole) If Not f Is Nothing Then If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then f.Resize(1, 4).Copy Destination:= _ Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0) End If End If Next r End Sub 前回の質問で教えていただいたコードなのですが、現時点では、B列のデータを元にして二つのSheetのデータを比較して別Sheetへコピーしているのですが、そのときに、B列以降の(たとえば、B列からX列まで)データはコピーできますが、A列もコピーしたい時はどうすればよいのかで、悩んでいます。どの様に変更すればよいのでしょうか?
- ベストアンサー
- オフィス系ソフト
お礼
有り難うございます。 やはりサブルーティンコールするのがスマートなのですね。 所で CALL 書かれていないですけれど 別に不要なのですか?