簡體   English   中英

Excel VBA - 不循環通過我的 while 循環

[英]Excel VBA - Not looping through my while loop

所以我有一個將數據粘貼到 excel 列中的代碼,然后我嘗試遍歷該列中的數據,並從 B 列中的每個值的數據創建一個新工作表,但它在完成此操作一次后停止,而不是循環通過列。

有任何想法嗎?

  i = 4

Do While Cells(i, 2).Value <> ""
    Worksheets("Front").Cells(5, 3).Value = Cells(i, 2)
    Worksheets("Front").Select
    Range("C2:M35").Select
    Selection.Copy
    Sheets("PlaceHolder").Select
    Range("C2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    Dim wks As Worksheet
    Set wks = ActiveSheet
    ActiveSheet.Copy After:=Worksheets(Sheets.Count)
    ActiveSheet.Name = wks.Range("C5").Value
    i = i + 1
Loop

代碼中的“單元格”和“范圍”都指 ActiveWorksheet,它可能以 Worksheets("Front") 開頭,然后使用Worksheets("Placeholder").Select語句將 ActiveWorksheet 更改為 Worksheets("Placeholder") . 我不確定創建新工作表是否將 ActiveWorksheet 設置為新工作表,我不應該知道使代碼工作。 您應該使用像這樣的顯式引用,而不是依賴對 ActiveWorksheet 的隱式引用。

'Style note: Always put Option Explict at the top of the module
'and declare all your variables at the top of the subroutine. 
Dim wsFront As Worksheet
Dim wsPlaceholder As Worksheet
Dim wsNewSheet As Worksheet
Dim i As Integer

Set wsFront = Worksheets("Front")
Set wsPlaceholder = Worksheets("Placeholder")

i = 4

Do While wsFront.Cells(i, 2).Value <> ""

    ' Copy data from Worksheets("Front")
    wsFront.Cells(5, 3).Value = Cells(i, 2)
    wsFront.Select
    wsFront.Range("C2:M35").Select
    Selection.Copy
    
    ' Paste data to Worksheets("Placeholder")
    wsPlaceholder.Select
    wsPlaceholder.Range("C2").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
    
    ' Copy Worksheets("Placeholder") to new worksheet
    wsPlaceholder.Copy After:=Worksheets(Sheets.Count)
    
    'Get a reference to the new worksheet
    Set wsNewSheet = Worksheets(Worksheets.Count)
    wsNewSheet.Name = wsPlaceholder.Range("C5").Value
    i = i + 1
Loop

在 Excel 中使用 VBA 時,通常不需要 select 或激活任何東西(盡管宏記錄器可能會嘗試建議)

If you plan on doing much VBA work in Excel then this is highly-recommended reading: How to avoid using Select in Excel VBA

Dim wsData As Worksheet, wsFront As Worksheet, wsPH As Worksheet, v
Dim wb As Workbook, i As Long

Set wb = ThisWorkbook
Set wsData = ActiveSheet 'or some other specific sheet
Set wsFront = wb.Worksheets("Front")
Set wsPH = wb.Worksheets("PlaceHolder")

i = 4

Do While wsData.Cells(i, 2).Value <> ""
    v = wsData.Cells(i, 2).Value
    wsFront.Cells(5, 3).Value = v
    
    wsFront.Range("C2:M35").Copy
    With wsPH.Range("C2")
        .PasteSpecial Paste:=xlPasteValues
        .PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    End With
    
    wsPH.Copy After:=wb.Worksheets(Sheets.Count)
    wb.Worksheets(Sheets.Count).Name = v
Loop

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM