2017-06-27 11 views
0

私はこのコードをデバッグするのに誰かが助けてくれるのだろうかと思っていました。ループが2番目の行に移動したときに、変更が配列内の要素を変更する理由がわかりません。Excel VBAを使用したループインパクトコード出力

たとえば、配列 "BookMarksToDelete"に "Dog、Cat、Bird"がある場合、2番目のループは次の行で "og、Cat、Bird"にしたいと思われます。

ループにはより良いアプローチがありますか?例えば

For Each rw In myRange.Rows 
    For Each cel In rw.Cells 
     For i = LBound(myArray) To UBound(myArray) 
      Set oCell = myRange.Find(What:=myArray(i), LookIn:=xlValues, _ 
         LookAt:=xlWhole, SearchOrder:=xlByRows, 
         SearchDirection:=xlNext, _ 
         MatchCase:=False, SearchFormat:=False) 

      If oCell Is Nothing Then 
       sTemp = sTemp & "," & myArray(i) 
      Else 
       Set oCell = Nothing 
      End If 
     Next i 

     sTemp = Mid(sTemp, 2) 

     If Not Len(Trim(sTemp)) = 0 Then 
      BookMarksToDelete = Split(sTemp, ",") 

      Set wdApp = CreateObject("Word.Application") 
      wdApp.Visible = True 
      Set wdDoc = wdApp.Documents.Open(FlName) 

      For i = LBound(BookMarksToDelete) To UBound(BookMarksToDelete) 
       Set pRng = wdDoc.Bookmarks(BookMarksToDelete(i)).Range 
       pRng.MoveEnd wdParagraph, 2 
       pRng.Delete 
      Next i 
     End If 

     Set wdTable = wdDoc.Tables(1) 
     For i = LBound(BookMarksToDelete) To UBound(BookMarksToDelete) 
      For Each cell In myRangeRef 
       If InStr(1, cell.Value, BookMarksToDelete(i), vbTextCompare) Then 
        aCell = cell.Offset(, -1).Value 
        stTemp = stTemp & "," & aCell 
       End If 
      Next cell 
     Next i 

     stTemp = Mid(stTemp, 2) 
     If Not Len(Trim(stTemp)) = 0 Then 
      ReturnsToDelete = Split(stTemp, ",") 
      For i = LBound(ReturnsToDelete) To UBound(ReturnsToDelete) 
       For j = wdTable.Rows.Count To 2 Step -1 
        If Left(wdTable.cell(j, 1).Range.Text, Len(wdTable.cell(j, 1).Range.Text) - 2) = ReturnsToDelete(i) Then wdTable.Rows(j).Delete 
       Next j 
      Next i 
     End If 

     With ThisWorkbook.Sheets("Investors Database") 
      firstName = .Range("B" & rw) 
      lastName = .Range("A" & rw) 
      titleName = lastName & ", " & firstName 
     End With 

     Set tRng = wdDoc.Bookmarks("TitlePageName").Range 
      tRng.Text = wdDoc.Bookmarks("TitlePageName").Range.Text & titleName 
      wdDoc.Bookmarks.Add "TitlePageName", tRng 

     d = "Information Up-To-Date as of " & Date 
     Set dRng = wdDoc.Bookmarks("TitlePageDate").Range 
      dRng.Text = wdDoc.Bookmarks("TitlePageDate").Range.Text & d 
      wdDoc.Bookmarks.Add "TitlePageDate", dRng 

     Set wRng = wdApp.ActiveDocument.Bookmarks("FundCommentary").Range 
     wRng.Collapse wdCollapseStart 
     wRng.InsertBreak wdPageBreak 

     Set sRng = wdApp.ActiveDocument.Bookmarks("Disclaimer").Range 
     sRng.Collapse wdCollapseStart 
     sRng.InsertBreak wdPageBreak 

     wdDoc.TablesOfContents(1).Update 
     wdDoc.Repaginate 

     With wdApp.ActiveDocument 
      .SaveAs2 "https://websitefolder//document.docx" 
      .Close 
     End With 

     wdApp.Visible = False 

    Next 
Next 

答えて

2

:配列「BookMarksToDeleteは」それでDog, Cat, Birdを持っている場合、第二のループは、次の行のog, Cat, Bird作りたいように見えます。

ループが1回目のために実行されると、sTempの値が""あるのでsTemp = sTemp & "," & myArray(i)先頭に,を追加し、最初から,オフsTemp = Mid(sTemp, 2)トリム。

sTempの値は""ではありませんが、次の行のコードsTemp = Mid(sTemp, 2)は第1文字のチョップです。

OPTION 1:コードの終わりにsTemp

をリセットラインsTemp = ""

OPTION 2を追加:あなたはsTempはその後、1文字目かどうかをチェックリセットしたくない場合,または

sTemp = Mid(sTemp, 2)If Left(sTemp, 1) = "," Then sTemp = Mid(sTemp, 2)

に置き換えます。
+0

ヘルプが必要です。https://stackoverflow.com/questions/44787615/dictionary-doesnt-display-items-for-certain-key-numeric-value –

+0

申し訳ありません。私の夕食を食べていた。それが解決されたようですか? –

+0

はい、今解決されました。ありがとうございました! –

関連する問題