2017-01-06 21 views
0

これは私がしばらくの間把握しようとしてきたエラーです。私のfindメソッドは結果を生成していません。Findメソッドのオブジェクト変数が設定されていません

コードは、InputSheetで文字列を検索し、行番号を報告し、その行番号に基づいて背景情報を背景に移動することを想定しています。次に、次の.findは、SummaryResultsで文字列を見つけて、Backgroundから情報を移動し、少し再フォーマットし、SummaryResultsに貼り付けます。

Findメソッドは結果を生成していないため、文字列がシートと正しい範囲にあっても、FindRow = Nothingになります。

このエラーは、別のExcelシートを開いた状態でマクロを実行した後に発生し始めたため、ActiveWorkbookが正しくない可能性がありますが、それ以降は実行できませんでした。

表示されている変数の中には、コードの他のセクションにあるものもありますが、デバッグモードでその変数にマウスポインタを合わせると、想定されているものが表示されます。

Option Explicit 

Sub CAESARCONVERSION() 
Dim InputSheet As Worksheet, SummaryResults As Worksheet, Background As Worksheet 
Dim i As Integer 
Dim j As Integer 
Dim x As Integer 
Dim y As Integer 
Dim h As Integer 
Dim v As Integer 
Dim c As Integer 
Dim z As Integer 
Dim myBook As Workbook 
Set myBook = Excel.ThisWorkbook 
Set InputSheet = myBook.Sheets("Input Sheet") 
Set SummaryResults = myBook.Sheets("Summary Results") 
Set Background = myBook.Sheets("Background") 
Dim NodeList As Integer 
Dim TotalCases As Integer 
Dim sMyString As String 
Dim Nodes As Variant 
Dim FindRow As Range 
Dim intValueToFind As String 
Dim FindRowNumber As Long 
Dim SecondRowNumber As Long 



'Clear the last run of macro 
Background.Range("A2:A1000").Cells.Clear 
Background.Range("C2:I10000").Cells.Clear 
SummaryResults.Cells.Clear 
'Code that will count the total number of load cases 

TotalCases = 0 
h = 2 
Dim text As String 
For v = 12 To 100 
    If InputSheet.Cells(v, 2).Value <> "" Then 
     text = LTrim(InputSheet.Cells(v, 2).Value) 
     Background.Cells(h, 3).Value = text 
     h = h + 1 
     TotalCases = TotalCases + 1 
    Else 
     GoTo NodeCounter 
    End If 
Next v 

NodeCounter: 
y = TotalCases - 1 
x = 0 
    Dim LoadCaseList() As Variant 
    ReDim LoadCaseList(y) 

LoadCaseList: 
For x = 0 To y 
    LoadCaseList(x) = Background.Cells(2 + x, 3).text 
Next x 


j = 2 

For i = 17 + TotalCases To 20000 'Need to define how far for the program to search, we may exceed 20000 at some point 
    If InputSheet.Cells(i, 2).Value <> "" Then 
    Background.Cells(j, 1).Value = InputSheet.Cells(i, 2).Value 
    j = j + 1 
    End If 
Next i 

With Background 
NodeList = Background.Cells(2, 2).Value 
Background.Range("AA1:XX" & NodeList + 1).Cells.Clear 
End With 

ReDim Nodes(NodeList - 1) 
v = 0 
j = 2 
For i = 0 To NodeList - 1 
    Nodes(i) = Background.Cells(j, 1).Value 
    j = j + 1 
Next i 



Headers: 
Dim LoadCaseHeader() As String 
Dim TypHeader() 
TypHeader = Array("Node", "L", "Direction", "Magnitude") 
Dim LoadDirections() 
LoadDirections = Array("X", "Y", "Z", "MX", "MY", "MZ") 

x = 0 
z = 0 

For x = 0 To NodeList - 1 
    For z = 0 To TotalCases - 1 
     SummaryResults.Range(("B" & 2 + (NodeList * 6 + 2) * z) & ":" & "E" & 2 + (NodeList * 6 + 2) * z) = TypHeader() 
     SummaryResults.Range("A" & 2 + (NodeList * 6 + 2) * z) = Background.Range("C" & 2 + z) 
    Next z 
Next x 

'Search rows for the first instance of this value. 



LoadCases: 

'Code that copies information from the InputSheet to the SummaryResults 
Dim LoadCases() As Long 
ReDim LoadCases(NodeList, 6) 
FindRowNumber = 0 
SecondRowNumber = 0 

For c = 0 To y 

    intValueToFind = LoadCaseList(c) 
    For i = 7 To 31 + TotalCases 
     With InputSheet 
      If Trim(Cells(i, 3).Value) = intValueToFind Then 
       MsgBox ("Found") 
       Set FindRow = InputSheet.Range("C:C").Find(What:=intValueToFind, LookIn:=xlValues) 
       FindRowNumber = FindRow.Row 
      End If 
     End With 
    Next i 

    'MsgBox FindRowNumber 

    With InputSheet 
     For i = 0 To NodeList - 1 
     x = 4 
      For j = 0 To 5 
       LoadCases(i, j) = InputSheet.Cells(FindRowNumber + (TotalCases + 3) * i, x) 
       x = x + 1 
      Next j 
     Next i 
    End With 



    Background.Range("AC2:AH" & NodeList + 1).Offset(0, c * 7) = LoadCases 

    For i = 1 To NodeList * 6 * TotalCases 
     With SummaryResults 
      If Trim(Cells(i, 5).Value) = intValueToFind Then 
       Set FindRow = SummaryResults.Range("A:A").Find(What:=intValueToFind, LookIn:=xlValues) 
       SecondRowNumber = FindRow.Row 
       GoTo Step2 
      End If 
     End With 
    Next i 
Step2: 
    With SummaryResults 
     For x = 0 To NodeList - 1 
      For j = 0 To 5 
       SummaryResults.Cells(SecondRowNumber + 1 + j + 6 * x, 5) = Background.Cells(x + 2, 29 + j) 
       SummaryResults.Cells(SecondRowNumber + 1 + j + 6 * x, 3) = TypHeader(1) 
       SummaryResults.Cells(SecondRowNumber + 1 + j + 6 * x, 4) = LoadDirections(j) 
       SummaryResults.Cells(SecondRowNumber + 1 + j + 6 * x, 2) = Nodes(x) 
      Next j 
     Next x 
    End With 

Next c 





End Sub 

助けてください。編集:コード全体をアップロードしました。追加情報は、コードはExcelにタブでは動作しませんが、タブで実行した場合には失敗します。

+4

スイッチ 'Set myBook = Excel.ActiveWorkbook'を' Set myBook = Excel.ThisWorkbook'に切り替えます。また、 Findが見つからない場合はトラップする、そうでない場合はFindByを返す –

+1

また、Range( "C12:C"&100)とは何ですか? –

+2

の「For c = 0 To y'」........ *** y ***とは何ですか? –

答えて

0

問題は、LoadCaseList()配列にデータが入力されないことが原因と考えられます。これは、検索文です:

Set FindRow = InputSheet.Range("C:C").Find(What:=intValueToFind, LookIn:=xlValues) 

intValueToFindはこの文によって設定されます。

intValueToFind = LoadCaseList(c) 

しかしLoadCaseList()配列は、後藤によって呼び出されることはありませんラベルで、次のコードによって作成されます声明(私の知る限り):だから

LoadCaseList: 
For x = 0 To y 
    LoadCaseList(x) = Background.Cells(2 + x, 3).text 
Next x 

LoadCaseListラベル文がLoadCaseList()配列が移入されることはありません、GoToステートメントによって呼び出されることはありませんされているので、 intValueToFindには値がないため、Findメソッドには検索する値がありません(空の文字列を除いて)。

関連する問題