2016-09-16 13 views
0

私は3つの異なる範囲でマクロを1つずつ実行しようとしています。範囲が選択されると、コードは正常に機能します(変数FとLが定義されています)。 r1-r3を必要な範囲に設定し、文字列変数を使用して範囲番号を連結したいとします。このコードは機能しますが、選択した範囲内に開始行と終了行番号を指定しません。これは、 "TableCalc"マクロにコードの開始と停止を指示するため、非常に重要です。私は次の範囲に移動したいと思います。ご協力いただきありがとうございます。excel vbaは文字列を範囲に変換します

Sub TestRangeBC() 

WS.Select 

Dim r1 As Range 
Dim r2 As Range 
Dim r3 As Range 
Dim rngx As String 
Dim num As Integer 
Dim rng As Range 

Set r1 = WS.Range("ONE") 
Set r2 = WS.Range("TWO") 
Set r3 = WS.Range("THREE") 

For num = 1 To 3 
    rngx = "r" & num 
    Set rng = Range(rngx) 

    Dim F As Integer 
    Dim L As Integer 

    F = rng.Row + 1 
    L = rng.Row + rng.Rows.Count - 2 
    Cells(F, 8).Select 

    Do While Cells(F, 8) <> "" And ActiveCell.Row <= L 

     'INSERT SITUATIONAL MACRO 
     Call TableCalc 
     WS.Select 
     ActiveCell.Offset(1, 0).Select 
    Loop 
Next num 

End Sub 
+0

あなたは「コードを開始および停止するとき、それはTableCalcマクロを伝える」とはどういう意味ですか?私はパラメータやグローバル変数が使用されて表示されません。 – Comintern

+0

[あなたの "状況マクロ"の部分に '.Select'](https://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)を使わないでください。それは助けるかもしれません。また、名前付き範囲は単一の行ですか?または複数の行? 'F8'でマクロを歩いていると、' F'は何に設定されますか?また、 'Cells(F、8)がオンになるシートを指定する必要があります。 – BruceWayne

+0

@Tony Abadieはこの 'Sub'と同じモジュールの' TableCalc'コードですか?なぜ 'Do While'ループで' Cell(F、8)<> '"が進まないのですか? –

答えて

0

これが答え(あなたのコードと何を達成しようとしているの一部はまだ不明であるとして)ではありませんが、あなたがあなたのオリジナルのポストに持っているものコーディングする「クリーン」と、より効率的な方法であります。

Option Explicit 

Dim WS    As Worksheet 

あなたのオリジナルのサブ短縮:

Sub TestRangeBC() 

' chanhe WS to your Sheet name 
Set WS = Sheets("Sheet1") 

Call ActiveRange("ONE") 
Call ActiveRange("TWO") 
Call ActiveRange("THREE") 

End Sub 

このSubは、名前付き範囲(あなたがあなたのワークブックに設定された)文字列としての名前を取得し、それに応じて範囲を設定します。

Sub ActiveRange(RangeName As String) 

Dim Rng     As Range 
Dim F     As Integer 
Dim L     As Integer 
Dim lRow    As Long 

With WS 
    Set Rng = .Range(RangeName) 

    ' just for debug purpose >> to ensure the right Range was passed and set 
    Debug.Print Rng.Address 

    F = Rng.Row + 1 
    L = Rng.Row + Rng.Rows.Count - 2 

    lRow = F 

    ' what you are trying to achieve in this loop is beyond me 
    Do While .Cells(F, 8) <> "" And .Cells(lRow, 8).Row <= L 
     Debug.Print .Cells(lRow, 8).Address 
     'INSERT SITUATIONAL MACRO 
     ' Call TableCalc 
     ' not sure you need to select WS sheet again 
     WS.Select 
     lRow = lRow + 1 
    Loop 
End With 

End Sub 

以下のループでどのようなテストをしようとしていますか?ループに留まる基準は何ですか?

Do While Cells(F, 8) <> "" And ActiveCell.Row <= L 
0

それはあなたが

やりたいことが何を言うのは本当に難しいですが、あなたは明確にし、助けることができる、以下のものを(うまくいけば)それをやってすることができます!

最初のオフ、あなたはだから私は範囲という名前の名前特定のサブによって充填する(すなわちString配列)の配列でいいと思う変数名

を「組み合わせる」ことができません

Function GetRanges() As String() 
    Dim ranges(1 To 3) As String 

    ranges(1) = "ONE" 
    ranges(2) = "TWO" 
    ranges(3) = "THREE" 
    GetRanges = ranges 
End Function 

あなたの「メイン」サブコードをクリーンアップし、そこだけ多くの関連するコードを保つことができるように:

Sub TestRangeBC() 
    Dim r As Variant 
    Dim ws As Worksheet 

    Set ws = Worksheets("Ranges") '<--| change "Ranges" to your actual worksheet name 

    For Each r In GetRanges() '<--| loop through all ranges names 
     DoIt ws, CStr(r) '<--| call the range name processing routine passing worksheet and its named range name 
    Next r 
End Sub 

「メイン」サブが直接収集した名前付き範囲の配列をループGetRanges()から、実際に現在のものを処理するためにDoIt()を呼び出します。

Sub DoIt(ws As Worksheet, rangeName As String) 
    Dim cell As Range 
    Dim iRow As Long 

    With ws.Range(rangeName) '<--| reference the passed name passed worksheet named range 
     For iRow = .Rows(2).Row To .Rows(.Rows.Count - 2).Row '<--| loop through its "inner" rows (i.e. off 1st and last rows) 
      Set cell = ws.Cells(iRow, 8) '<--| get current row corresponding cell in column "F" 
      If cell.value = "" Then Exit For '<--| exit at first blank column "F" corresponding cell 
      TableCalc cell '<-- call TableCalc passing the 'valid' cell as its parameter 
     Next iRow 
    End With 
End Sub 
+0

@トニー・アバディー、それをやりましたか? – user3598756

関連する問題