2013-07-22 84 views
0
Sub combine() 
    Dim inName, inNum, inCity As String 
    Dim IncNum As Integer 
    Dim temp As Range 
    Dim lrow As Long 
    Dim counter As Integer 

    Dim cityCells, sNameCells, sNumCells As Range 

    cityCells = Sheets("Sheet2").UsedRange.Columns(1).Cells 

    For Each Cell In cityCells 
     If Cell <> "" And Cell.Row <> 1 Then 
      inCity = Cell.Value 
      inName = Sheets("Sheet2").Cells(Cell.Row, 2) 
      inNum = Sheets("Sheet2").Cells(Cell.Row, 3) 

      Set temp = Sheets("Sheet1").Columns(1).Find(what:=inCity) 

      If temp Is Nothing Then 
      'find the last row of the existing sheet 
       lrowEx = Sheets("Sheet1").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
       IncNum = Sheets("Sheet2").UsedRange.Columns.Count 

       For counter = 1 To IncNum 
        Sheets("Sheet1").Cells(lrow + 1, counter) = Cells(Cell.Row, counter) 
       Next counter 

      End If 

     End If 

     Next 

     End Sub 

我從表(「工作表Sheet」)得到一個對象所需的誤差。將細胞(lrow + 1,計數器)=細胞(Cell.Row,計數器)線,任何幫助?對象所需錯誤Sheet 1中

我是vba btw的新手,任何指出上述代碼的東西將不勝感激。

回答

0

這裏是我的解決方案。我添加了另一個循環,你可以忽略它。 @Elias

Sub combine() 
    Dim inName, inNum, inCity As String 
    Dim IncNum, inRow, ExcNum As Integer 
    Dim temp As Range 
    Dim lrowEx As Long 
    Dim counter1, counter2 As Integer 


    Dim cityCells, sNameCells, sNumCells As Range 

    IncNum = Sheets("Sheet2").UsedRange.Columns.Count 
    ExcNum = Sheets("Sheet1").UsedRange.Columns.Count 

    If IncNum > ExcNum Then 
     'find the last column of existing sheet and input sheet 
     lcolEx = Sheets("Sheet1").Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 
     lcolIn = Sheets("Sheet2").Cells.Find("*", SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column 

     For counter1 = lcolEx + 1 To lcolIn 
      Sheets("Sheet1").Cells(1, lcolEx + 1) = Sheets("Sheet2").UsedRange.Rows(1).Cells(1, lcolEx + 1) 
     Next counter1 

    End If 

    For Each cell In Sheets("Sheet2").UsedRange.Columns(1).Cells 
     If cell <> "" And cell.Row <> 1 Then 
      inCity = cell.Value 
      inName = Sheets("Sheet2").Cells(cell.Row, 2) 
      inNum = Sheets("Sheet2").Cells(cell.Row, 3) 
      inRow = cell.Row 

      Set temp = Sheets("Sheet1").Columns(1).Find(what:=inCity) 

      If temp Is Nothing Then 
      'find the last row of the existing sheet 
       lrowEx = Sheets("Sheet1").Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 

       For counter = 1 To IncNum 
        Sheets("Sheet1").Cells(lrowEx + 1, counter) = Sheets("Sheet2").UsedRange.Columns(1).Cells(cell.Row, counter) 
       Next counter 

      End If 

     End If 

    Next 

End Sub 
+0

這是我的解決方案。我添加了另一個循環,你可以忽略它。 @Elias – user2600411

1

我無法發表評論,所以我會留下一個答案,但您確定lRow正在返回一個值嗎?你可能會試圖做:

Sheets("Sheet1").Cells(NULL + 1, counter) = Cells(Cell.Row, counter) 

也儘量

Sheets("Sheet1").Cells(lrow + 1, counter).Value = Cells(Cell.Row, counter) 

ALSO

Cells(Cell.Row,Counter)不是一個工作表對象

+0

「你的單元格(Cell.Row,Counter)不是工作表對象的一部分」 - 我不確定你是什麼意思? –

+0

其實我忽略了你的For Each語句,我的不好! – Elias

+0

感謝回覆問題解決。@ Andy G @Elias – user2600411

0

我前行的接收錯誤部分的OP提及。

您應該聲明所有變量並在模塊頂部添加Option Explicit以確保聲明所有變量。

此行

Dim cityCells, sNameCells, sNumCells As Range 

只聲明sNumCells作爲Range別人會變種。這意味着該行:

cityCells = Sheets("Sheet2").UsedRange.Columns(1).Cells 

返回一個變體陣列,而不是一個Range這導致我接收錯誤之一。

聲明所有變量允許代碼(對我來說)運行:

Dim lRowEx As Long 
Dim Cell As Range 

Dim cityCells As Range, sNameCells As Range, sNumCells As Range 

Set cityCells = Sheets("Sheet2").UsedRange.Columns(1).Cells 

For Each Cell In cityCells