2013-07-23 29 views
0

我在同一個Excel工作簿中有兩個excel表Sheet1和Sheet2。在Sheet1中,我有 以下數據,如圖片1。 Picture 1 我只是想將A列,B列和總數複製到sheet2。 在VBA我用這個code.Which工作正常,但是當我將它轉換爲 VB.Net如何在excel中查找最後一列並在VB.Net中複製

Sub VBA() 
    Sheets("Sheet1").Select 
    Range("A2:B4").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.Copy 
    Sheets("Sheet2").Select 
    Range("A2").Select 
    ActiveSheet.Paste 
    Sheets("Sheet1").Select 
    Range("A2").Select 
    Selection.End(xlToRight).Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Selection.Copy 
    Sheets("Sheet2").Select 
    Range("C2").Select 
    ActiveSheet.Paste 
End Sub 

在VB.Net我使用這個代碼將數據從工作表Sheet1到Sheet2複製問題就出現了。

Private Sub Button1_Click 
    Dim xlApp As New Excel.Application 
    Dim xlwb As Excel.Workbook 
    Dim xlsheet, xlsheet2 As Excel.Worksheet 
    Dim lCol As Long = 0 
    Dim xlsourceRange, xlDestRange As Excel.Range 
    with xlApp 
    .visible = True 
    xlwb = .workbooks.open("D:\test.xlsx") 
    xlsheet = xlwb.Sheets("Sheet1") 
    xlsheet2 = xlwb.Sheets("Sheet2") 
    xlSourceRange = xlSheet.Range("A2:B2000")'This is copies Column A and Column B 
    xlDestRange = xlsheet2.Range("A2") 
    xlSourceRange.Copy(xlDestRange) 

    End with 
    End Sub 
    End Class 

真正的問題是要複製第一列中的總數,如圖片1所示。我無法將其複製到sheet2,因爲數據在sheet1中不固定,而是向右增加。我的意思是,在目前的Senario中,我有6位客戶,從c列到H,總數在第1列。但是如果有另外兩位客戶,Total列從第I列移動到第K列。在這方面的任何幫助都非常實用。

Manny感謝來自MSDN的Kevin尋找時間來回答這個問題。來自Kenvin。 從註釋開始,事情並不像以下解釋的那麼簡單。

好的,從你提交的文件中,我認爲得到總數(不知道你想在列中找到哪一個)或者最後一個(13,886)很簡單。使用自動化最後一列失敗,因爲列S是每個Excel的最後一列,Excel的最後一行報告是2628.長話短說我使用下面的第一條SQL語句來猜測最後一行/列(SELECT TOP * 8),將這些值遞增爲1。如果最後一部分工作,我然後選擇總列沒有空單元格值的數據,這當然會刪除Total以上的行,所以稍後我會照顧到這一點。當讀取總列中的單元格值時,我將帶有負值的單元格視爲字符串,並將它們轉換爲罕見的負值,然後將它們存儲爲字符串,因爲我們無法將常規文本值與數值一起存儲(但您可以將我的邏輯調整爲這樣做)。最後,DataTable有兩列我們關心行索引和值。使用行索引和值你有列總數和行總數。

我沒有做的是實際複製到另一張表。最後,當看到像這樣的數據時,期望的是當找到實際的最後一行/列和數據的混合數據時,我非常清楚將會有相當數量的代碼。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 
     Dim dt As New DataTable 
     Dim Builder As New OleDb.OleDbConnectionStringBuilder With 
      { 
       .DataSource = IO.Path.Combine(Application.StartupPath, "WS_1.xlsx"), 
       .Provider = "Microsoft.ACE.OLEDB.12.0" 
      } 
     Builder.Add("Extended Properties", "Excel 12.0;IMEX=1;HDR=No;") 
     Using cn As New OleDb.OleDbConnection With {.ConnectionString = Builder.ConnectionString} 
      Using cmd As New OleDb.OleDbCommand With 
       { 
        .Connection = cn, 
        .CommandText = "SELECT Top 8 * FROM [Customer$]" 
       } 
       cn.Open() 
       dt.Load(cmd.ExecuteReader) 
       Dim FoundRow As Int32 = -1 
       Dim FoundCol As Int32 = -1 
       For Row As Integer = 0 To dt.Rows.Count - 1 
        For Col As Int32 = 0 To dt.Columns.Count - 1 
         If dt.Rows(Row).Item(Col).ToString = "Total" Then 
          FoundRow = Row + 1 
          FoundCol = Col + 1 
         End If 
        Next 
       Next 
       If FoundRow > -1 Then 
        dt = New DataTable 
        cmd.CommandText = <SQL>SELECT F<%= FoundCol %> FROM [Customer$] WHERE Not IsNull(F<%= FoundCol %>) </SQL>.Value 
        dt.Load(cmd.ExecuteReader) 
        Dim NewTable As New DataTable With {.TableName = "MyTable"} 
        NewTable.Columns.Add(New DataColumn With {.ColumnName = "Identifier", .DataType = GetType(Int32), .AutoIncrement = True, .AutoIncrementSeed = 1}) 
        NewTable.Columns.Add(New DataColumn With {.ColumnName = "RowIndex", .DataType = GetType(Int32)}) 
        NewTable.Columns.Add(New DataColumn With {.ColumnName = "Value", .DataType = GetType(String)}) 
        For Each row As DataRow In dt.Rows 
         Dim Temp As String = row.Item(0).ToString.TrimStart 
         If Temp.StartsWith("(") Then 
          Temp = System.Text.RegularExpressions.Regex.Replace(Temp, "[)(,]", "") 
          Dim Value As Int32 = 0 
          If Int32.TryParse(Temp, Value) Then 
           Value = Value * -1 
           Console.WriteLine(Value) 
           NewTable.Rows.Add(New Object() {Nothing, Nothing, Value.ToString}) 
          Else 
           NewTable.Rows.Add(New Object() {Nothing, Nothing, Value.ToString}) 
          End If 
         Else 
          NewTable.Rows.Add(New Object() {Nothing, Nothing, Temp}) 
         End If 
        Next 
        Dim xrow As DataRow 
        For i As Int32 = 1 To FoundRow - 1 
         xrow = NewTable.NewRow 
         NewTable.Rows.InsertAt(xrow, 0) 
        Next 
        For i As Int32 = 0 To NewTable.Rows.Count - 1 
         NewTable.Rows(i).SetField(Of Int32)("RowIndex", i) 
        Next 
        Console.WriteLine() 
       Else 
        Console.WriteLine("Did not find a column with Total.") 
       End If 
      End Using 
     End Using 
    End Sub 

代碼模塊。

​​

回答

0

這是獲得C列總數的方法之一?在哪裏?意味着可能會隨時更改的未指定列。如果將此公式插入到單元格G3中,它將返回單元格C3:F3的總和。或者如果你把它放入R7,它會給你C7:Q7的總和。

rg.Formula = "=SUM(INDIRECT(ADDRESS(ROW(),3)&"":""&ADDRESS(ROW(),COLUMN()-1)))" 
+0

源列不固定。但目標列已修復。我正在嘗試從sheet1到sheet2列C的最後一列。 –

+0

所以你想複製並粘貼爲值? RangeSource.Copy> RangeDest.PasteSpecial ... –

相關問題