2013-03-13 55 views
1

我剛剛開始使用Excel的VBA代碼,因此很抱歉,如果這看起來很基本。我想執行以下操作...從符合條件的行中將選定列複製到另一個表格的VBA代碼

檢查名爲「索引」的紙張的J列(J5到J500)是否存在值「Y」。這是我的情況。 然後,我只想複製列C到我只有任何行符合條件的現有工作表和單元格在不同的位置,即如果索引值C3到I3被複制我想將它們粘貼到A5對於我所在活動工作表的G5,請參閱Sheet2。

如果索引表發生變化,我希望自動複製數據,如果可能的話。如果將新數據添加到索引,它如何工作?

經過大量的搜索後,我發現this。從這個問題我稍微改變了代碼,以適應我的要求,這將滿足條件的整個行復制到我運行宏從一個表,但我很難爲如何選擇某些列只。

Sub CopyRowsAcross() 

Dim i As Integer 
Dim ws1 As Worksheet: Set ws1 = ThisWorkbook.Sheets("Index") 
Dim ws2 As Worksheet: Set ws2 = ActiveSheet 

For i = 2 To ws1.Range("B65536").End(xlUp).Row 
If ws1.Cells(i, 2) = "Y" Then ws1.Rows(i).Copy ws2.Rows(ws2.Cells(ws2.Rows.Count, 2).End(xlUp).Row + 1) 
Next i 

End Sub 

任何幫助表示讚賞

約翰

編輯:我創建了一個實體模型和其位於https://docs.google.com/file/d/0B0RttRif9NI0TGl0N1BZQWZfaFk/edit?usp=sharing

不需要A和B柱複印的情況 - 要麼是列J - 多數民衆贊成我正在使用檢查的條件。

感謝您的所有幫助。

+1

如果您希望能夠在不首先從目標工作表中清除所有內容的情況下運行此操作,那麼您將需要至少一個**唯一的**值,可用於識別每一行,否則將無法匹配兩張紙之間的行。 – 2013-03-13 21:19:03

+0

感謝您的回覆Tim。考慮一下,當我想更新時,從索引表中擦除數據並重新複製可能會更好,例如,索引內容已更改或添加了新行。我認爲這意味着我需要通過重新運行宏來手動更新。我會好的。我是否仍然需要獨特的參考資料如果我要採取這種方法? – JohnM 2013-03-13 21:58:21

回答

0

下面是更優雅的解決方案,更類似於我原來的帖子。唯一的區別是單元格引用符合正確的表單。

Sub try3() 
Dim i, x As Long 
Dim Y as String 
Dim ws1 As Worksheet: Set ws1 = ActiveWorkbook.Sheets("Index") 
Dim ws2 As Worksheet: Set ws2 = ActiveWorkbook.Sheets("Sheet2") 'active sheet can get you into trouble 

x = 5 
Y = "Y" 
For i = 2 To 500: 
    If ws1.Cells(i, 10) = Y Then 
     Range(ws2.Cells(x, 1), ws2.Cells(x, 7)).Value = Range(ws1.Cells(i, 3), ws1.Cells(i, 9)).Value 
     x = x + 1 
    End If 
Next i 
End Sub 

+0

@JohnM在For語句中,我們檢查J [10]列來查看它是否爲變量Y.如果是,則將sheet2中的目標範圍值設置爲Index中源範圍的值。 X會在順序行上放置順序的真實實例(從您的問題的第5行開始)。 – 2013-03-14 02:25:57

+0

感謝Atl LED。如果你不介意,我還有一個最後的問題。索引中的一些單元格會有公式 - 我忘記提及原始問題中的小但非常重要的細節......如何更改代碼以便包含單元格格式(即公式等)? – JohnM 2013-03-14 17:24:49

+0

@JohnM我認爲你需要問一個新的問題/環顧一下。 – 2013-03-14 21:33:14

0

這是借用一些舊的代碼。在此要檢查的最後一排使用,如果你知道你只想要去到500,你可以只使用整數

Sub try2()

Dim i, Y, x As Long 'you didn't mention what Y was, so it could also be a string. 
    Dim ws1 As Worksheet: Set ws1 = ActiveWorkbook.Sheets("Index") 
    Dim ws2 As Worksheet: Set ws2 = ActiveWorkbook.Sheets("Sheet2") 'active sheet can get you into trouble 
    Dim Ary1 As Range 
    Dim ary2 As Range 


    x = 5 
    Y = "Y" 'for the sake of argument 
     'For i = 2 To ws1.Range("B65536").End(xlUp).Row This is if you are looking for the last row in MsOf2003 or earlier. If you know that you are only looking to row 500, then hard code the intiger. 
    For i = 2 To 500: 
     'If ws1.Cells(i, 2) = "Y" You mentioned you were interested in column J, so we need to change the 2 to 10 (Column B to Column J) 
     If ws1.Cells(i, 10) = Y Then 
      ws1.Activate 
      Set Ary1 = Range(Cells(i, 3), Cells(i, 9)) 
      ws2.Activate 
      Set ary2 = Range(Cells(x, 1), Cells(x, 7)) 'avoid copying all together you don't need it 
      ary2.Value = Ary1.Value 
      x = x + 1 
     End If 
    Next i 
    End Sub 

我在手機上寫這不編譯器,所以在那裏可能有語法錯誤,這應該被看作僞VBA代碼。我可以稍後檢查一下,看看你是否有效。如果你不想讓它們被覆蓋,你將不得不注意你放置的位置。

+0

感謝Atl LED。我應該澄清,Y是我正在尋找的實際單元格值,而不是變量。我可能編寫了這個不正確的代碼。記住上面的代碼會有根本的不同嗎?無論如何,我會拿它去看它是如何發生的,我會回來。謝謝 – JohnM 2013-03-13 22:02:57

+0

我試過這個,當我運行代碼時它給出了一個錯誤信息:運行時錯誤'1004'對象'工作表'的方法'範圍'失敗。我在原始問題中添加了一個示例電子表格,以便更容易地看到我在做什麼。 – JohnM 2013-03-13 22:43:25

+0

@JohnM對不起,我仍然沒有在那裏檢查代碼,但是您是否像在示例中那樣更改了工作表名稱Sheet2?您需要將變量改爲有意義的。 – 2013-03-13 22:50:20

相關問題