0

私は次のようにコードを書きます:

Call search(xx, yy, "APM Output", ">> State Scalars", label1)

label1:
      ...........

これはサブ検索のスクリプトです

Sub search(row As Variant, col As Variant, wkst As String, str As String, label_num As Name)
For row = 1 To 100
  For col = 1 To 100
    strTemp = Worksheets(wkst).Cells(row, col).Value
    If InStr(strTemp, str) <> 0 Then
        GoTo label_num
    End If
  Next
Next
End Sub

最初にsubsearch(..)を呼び出してから、label1に移動します。問題は、label_numの「ByRef引数タイプの不一致」ということです。Subsearch(..、..、..、label_num)のlabel_numの正しいタイプは何でしょうか?

オリジナルのスクリプトを追加します。これらはsub()に変換したいものです。

For xx = 1 To 100
    For yy = 1 To 100
        strTemp = Worksheets("APM Output").Cells(xx, yy).Value
        If InStr(strTemp, ">> State Scalars") <> 0 Then
            GoTo label1
        End If
    Next
Next
label1:
    For uu = 1 To 100
        For vv = 1 To 100
            strTemp = Worksheets("APM Output").Cells(uu, vv).Value
            If InStr(strTemp, ">> GPU LPML") <> 0 Then
                GoTo label2
            End If
        Next
    Next
label2:
    For mm = 1 To 100
        For nn = 1 To 100
            strTemp = Worksheets("APM Output").Cells(mm, nn).Value
            If InStr(strTemp, ">> Limits and Equations") <> 0 Then
                GoTo label3
            End If
        Next
    Next
4

2 に答える 2

3

あなたの潜水艦は私にはあまり意味がありません

  1. ループ">> State Scalars"が存在することがわかった場合は、Forlabel1
  2. とにかく">> State Scalars"リーチが見つからない場合label1

以下のコードを使用できます

  • 1回のショットで100x100のセル範囲を検索します
  • 部分的な文字列の一致が見つかるか、見つからない
  • 検索が成功した(または失敗した)後に検索を停止するように簡単に変更できます

code

Sub ReCut()
Dim rng1 As Range
Dim rng2 As Range
Set rng2 = Worksheets("APM Output").Range("A1:CV100")
Set rng1 = rng2.Find(">> State Scalars", , xlValues, xlPart)
If Not rng1 Is Nothing Then
MsgBox "Found >> State Scalars value at " & rng1.Address(0, 0) & vbNewLine & "This is the equivalent of your exit on INSTR"
Else
End If
Set rng1 = rng2.Find(">> GPU LPML", , xlValues, xlPart)
If Not rng1 Is Nothing Then
MsgBox "Found >> GPU LPML value at " & rng1.Address(0, 0) & vbNewLine & "This is the equivalent of your exit on INSTR"
Else
End If
End Sub
于 2012-09-20T05:41:05.217 に答える
1

良い習慣として、ラベルの使用は絶対に避けてください。

コードを変更するだけでお答えします。xx、yy、uu、vv、mm、nnの値を保存したいと思います。

次のコードは、ラベルの使用を回避する方法です

Dim found1 As Boolean
Dim found2  As Boolean
Dim found3 As Boolean
  found1 = False
  found2 = False
  found3 = False
  For i = 1 To 100
   For j = 1 To 100
       strTemp = Worksheets("APM Output").Cells(i, j).Value
       If InStr(strTemp, ">> State Scalars") <> 0 And Not found1 Then
           found1 = True
           xx = i
           yy = j
       End If

       If InStr(strTemp, ">> GPU LPML") <> 0 And Not found2 Then
           found2 = True
           uu = i
           vv = j
       End If
       If InStr(strTemp, ">> Limits and Equations") <> 0 And Not found3 Then
           found3 = True
           mm = i
           nn = j
       End If
   Next j
Next i

関数をサブにするには、次のようにします。

Sub my_search(ByRef rowNum As Long, ByRef colNum As Long, ByVal searchString As String, ByVal height As Long, ByVal width As Long, ByRef ws As Worksheet)
Dim i As Long
Dim j As Long
Dim found As Boolean
found = False
Dim strTemp
With ws
    For i = 1 To height 
       For j = 1 To width 
           strTemp = ws.Cells(i, j).Value
           If InStr(strTemp, searchString ) <> 0 And Not found1 Then
               found = True
               rowNum = i 'assigning rowNum 
               colNum = j 'assigning colNum
               Exit For
           End If
       Next j
       If found Then
        Exit For
        End If
    Next i

End With
End Sub

たとえば、3回呼び出します。

my_search xx,yy,">>State Scalars", 100, 100, Worksheets("APM Output")
于 2012-09-24T05:10:35.460 に答える