2014-02-12 138 views
2

從字面上看,二十年來我第一次完成了這個工作,這甚至超級基礎(沒有雙關語意思)。我有Sheet1 ("Main Page"),我根據Column B中輸入的數據從("Control Sequences")複製數據。我有它的工作。我遇到的問題是當我複製第一組數據,然後想要引入另一組數據時,代碼再次運行整個表單並覆蓋之前做過的任何調整。我希望能夠將一組數據帶入Sheet1,手動跳過幾行,在下面的column B中鍵入另一個值,然後重新運行代碼並添加新數據。我會嘗試提出如果這樣做沒有意義,則可以簡單解釋一下。現在大腦是炒5小時VBA吸收後:P這裏是我的代碼到目前爲止的全部(這有點蠻力所以要小心):將其他工作表的行添加到主工作表

Sub test() 
    Dim i As Integer   'Main Page Sheet Row Number 
    Dim n As Integer   'Control Sequences Sheet Row Number 
    Dim x As Integer   'Main Page Current Row Number 
    Dim y As Integer   'Column Number 
    Dim CSrow As Integer  'Current Row 
    Dim NextCS As Integer  'Next Control Sequence 
    Dim NextCSrow As Integer 'Row To Stop At 
    Dim ws1 As Worksheet  'Var 
    Dim ws2 As Worksheet  'Var 
    Set ws1 = Worksheets("Main Page") 
    Set ws2 = Worksheets("Control Sequences") 

    y = 2 

    'Cycles through the codes in sheet 1 
    For i = 2 To ws1.Cells(ws1.Rows.Count, y).End(xlUp).row Step 1 
     For n = 2 To ws2.Cells(ws2.Rows.Count, y).End(xlUp).row Step 1 
      If ws1.Cells(i, y).Value = ws2.Cells(n, y).Value Then 
       x = i 
       CSrow = ws2.Cells(n, y).row 
       NextCS = ws1.Cells(i, y).Value + 1 
       NextCSrow = Application.WorksheetFunction.Match(NextCS, ws2.Range("B1:B200"), 0) 
       NextCSrow = NextCSrow - 1 
       For CSrow = CSrow To NextCSrow 
        y = y + 1 
        For y = 3 To 7 
         ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        Next y 
        ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula 
        y = y + 1 
        ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        y = y + 2 
        ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        x = x + 1 
        y = 2 
       Next CSrow 
      End If 
     Next n 
    Next i 
End Sub 

由於任何人的幫助和投入。

編輯2014年2月13日
正如下面的答案的評論中提到,我拿出一塊.End(xlUp)和它的工作。我也改變了寫作循環體,以這樣的:

  For CSrow = CSrow To NextCSrow 
       ' y = y + 1 
       ' For y = 3 To 7 
       '  ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
       ' Next y 
       ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula 
       ' y = y + 1 
       ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
       ' y = y + 2 
       ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
       ' x = x + 1 
       ' y = 2 
       ws2.Rows(CSrow).Copy Destination:=ws1.Cells(x, 1) 
       x = x + 1 
      Next CSrow` 

我已經得到了格式和公式沒有保留原來的參考拷貝過來:d開,第四部分...測試所有的變量,而不僅僅是1;)我將繼續更新此線程以及...更新。

編輯二零一四年二月二十日 下面是完整的代碼,目前的情況是:

Sub test() 
    Dim i As Long    'Main Page Sheet Row Number 
    Dim j As Long    'Placeholder 
    Dim n As Long    'Control Sequences Sheet Row Number 
    Dim x As Long    'Main Page Current Row Number 
    Dim y As Long    'Column Number 
    Dim z As Long 
    Dim a As Long 
    Dim CSrow As Long   'Current Row 
    Dim NextCS As Long   'Next Control Sequence 
    Dim NextCSrow As Long  'Row To Stop At 
    Dim ws1 As Worksheet  'Var 
    Dim ws2 As Worksheet  'Var 
    Dim ws3 As Worksheet  'Var 
    Dim ws4 As Worksheet  'Var 
    ' Set ws1 = Worksheets("Main Page") 
    Set ws1 = ActiveSheet 
    Set ws2 = Worksheets("Control Sequences") 
    Set ws3 = Worksheets("Cost 1") 
    Set ws4 = Worksheets("Cost 2") 

    If ws1.Name = ws2.Name Or ws1.Name = ws3.Name Or ws1.Name = ws4.Name Then 
     End 
    End If 

    y = 2 
    z = 10 
    a = ws1.Cells(ws1.Rows.Count, z).End(xlUp).row + 2 
    If IsEmpty(ws1.Cells(a, y).Value) Then End 

    'Cycles through the codes in sheet 1 
    j = ws1.Cells(ws1.Rows.Count, y).End(xlUp).row 
    i = ws1.Cells(j, y).row 
    For i = i To j Step 1 
     For n = 2 To ws2.Cells(ws2.Rows.Count, y).End(xlUp).row Step 1 
      If ws1.Cells(i, y).Value = ws2.Cells(n, y).Value Then 
       x = i 
       CSrow = ws2.Cells(n, y).row 
       NextCS = ws1.Cells(i, y).Value + 1 
       NextCSrow = Application.WorksheetFunction.Match(NextCS, ws2.Range("B1:B100"), 0) 
       NextCSrow = NextCSrow - 1 
       For CSrow = CSrow To NextCSrow 
        ' y = y + 1 
        ' For y = 3 To 7 
        '  ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        ' Next y 
        ' ws1.Cells(x, 8).Formula = ws2.Cells(CSrow, 8).Formula 
        ' y = y + 1 
        ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        ' y = y + 2 
        ' ws1.Cells(x, y).Value = ws2.Cells(CSrow, y).Value 
        ' x = x + 1 
        ' y = 2 
        ws2.Rows(CSrow).Copy Destination:=ws1.Cells(x, 1) 
        x = x + 1 
       Next CSrow 
      End If 
     Next n 
    Next i 
End Sub 

我添加了一個檢查,如果用戶是在任何一個「模板」張,代碼只是停止。這有點蠻力,但它完成了工作,而且它是我擁有的唯一代碼。也許如果我繼續這樣做,我會盡量讓它更「精簡」。 :D感謝大家的意見和幫助。

+0

你能以某種方式顯示數據前後? – L42

+0

嗨L42,我不能在這個時候。非公開信息。一旦我得到它的工作,我會拿出一個虛擬的數據集併發布。 –

+0

Np。我只是想,也許循環不是這裏最好的辦法,但如果它適合你,那麼它確定:) – L42

回答

1

我想我有。您的問題出現在循環的第一行:

For i = 2 To ws1.Cells(ws1.Rows.Count, y).End(xlUp).row Step 1 

在循環開始之前動態設置i。​​此另一個變量j,然後用下面的代碼替換上述行:

j = ws1.Cells(ws1.Rows.Count, y).End(xlUp).row 
i = ws1.Cells(j, y).End(xlUp).row 
For i = i to j Step 1 

當你在它,改變你的行整數長,因爲有工作表不是整數能處理更多的行。

+0

優秀!有用! :D謝謝。現在我將繼續討論第二部分和第三部分,複製一個公式而不保留其原始參考(我的註釋掉的行)以及單元格的複製格式(填充,邊框等)。如果我可以'弄明白了。再次感謝! –

+0

嗯......這是第一次,現在它回來了,覆蓋了變化。 ??? –

+0

我拿出'.End(xlUp)',因爲在看完'i'後,它回到上一個入口並從那裏開始。我會繼續測試和更新。 –

相關問題