2015-01-06 102 views
1

我寫了一個從sql server 2008 r2中提取數據的(下面)宏。我的問題是,當用戶第一次運行宏時,輸入Jobnumber(比如J0001),excel將數據放在電子表格的單元格「A1」開始,這很好。這裏的問題是,當用戶通過輸入作業號(例如J0002)第二次運行宏時,Excel將作業號(J0002)的數據放在單元格「A1」上,並將單元格J0001(第一個作業)移動到單元格「F」而不是向下移動。如何將電子表格中的上一個條目與最新的條目相比較?第二次執行宏後將Excel單元格向下移動

這是我的宏觀和附件:

Sub Task() 
Dim sqlstring As String 
Dim connstring As String 
Dim Strcode As String 
Strcode = Trim(InputBox("Please enter a Job #", "Task history")) 
sqlstring = "select distinct m.JobNumber , cast(m.ExpectedDate as DATE) 'Ship Date' ,m.CustLongName 'Customer' & _ 
      " from ArchiveJobHeader m left join AuxiliaryInfoFile af (nolock) on af.jobnumber=m.jobnumber & _ 
      " where m.JobNumber = '" & Trim(Strcode) & "'" & _ 
      " order by 'Resulttime'" 
connstring = "ODBC;DSN=SQLDSN;UID=test;PWD=test123" 
Dim thisQT As QueryTable 
Set thisQT = ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("a1", "a1000")) 
thisQT.BackgroundQuery = False 
thisQT.Sql = sqlstring 
thisQT.Refresh 
End Sub][1] 
+0

這是QueryTable的功能。當你刷新它時,它會用新數據替換舊數據(刷新!)。我真正想知道的是爲什麼它不會覆蓋舊數據,而是將它移到一邊?也許是因爲你每次運行你的代碼時都添加了一個新的QueryTable?無論如何,退出使用QueryTables,只是得到查詢結果到一個記錄集,並寫在你想要的記錄。 –

+0

@GeneSkuratovsky - 我是Excel VBA的新手。我真的很感激,如果你可以幫我用當前宏的記錄集。 – LearningMacro

+0

發生這種情況是因爲這段代碼:Destination:= Range(「a1」 –

回答

1

如果您合併lastRow檢查,然後爲下一個行編號分配一個變量,則可以連接您的範圍,並且每次都會有一個新行。

Dim lastRow As Long, nextRow As Long 

lastRow = Sheets("Sheet Name").Range("A" & Rows.count).End(xlUp).row 
nextRow = lastRow + 1 

然後,當您設置您的範圍,連接變量和字符串。

Set thisQT = ActiveSheet.QueryTables.Add(_ 
       Connection:=connstring, _ 
       Destination:=Range("A" & nextRow)) 

我不確定你在做什麼1000行如你的問題所示。但是,這是使用正常範圍地址的變量的想法。

+0

謝謝!您的解決方案有效。 – LearningMacro

+0

@Gene Skuratovsky-感謝您的幫助 – LearningMacro

0

你可能有這樣的事情:

Sub a() 
'Must set Reference to "Microsoft ActiveX Data Objects 2.8 Library" 
    Dim ws As Worksheet 
    Dim n As Long ' Row To Write In 
    Dim sql As String 
    Dim cn As ADODB.Connection 
    Dim rs As ADODB.Recordset 
    Dim i As Long 

    Set ws = ThisWorkbook.Worksheets("Tab Name") 
    'Assuming you already have Headings in row 1 _ 
     and start adding records from "A2" down... 
    n = ws.Range("A10000").End(xlUp).row + 1 
    'you sql string above is missing some double quotes... 
    sql = "select distinct m.JobNumber, cast(m.ExpectedDate as DATE) 'Ship Date', m.CustLongName 'Customer'" & _ 
      " from ArchiveJobHeader m left join AuxiliaryInfoFile af (nolock) on af.jobnumber=m.jobnumber" & _ 
      " where m.JobNumber = '" & Trim(Strcode) & "'" & _ 
      " order by 'Resulttime'" 
    Set cn = New ADODB.Connection 
    ' using an ODBC DSN... as in <http://msdn.microsoft.com/en-us/library/ms807027.aspx> 
    cn.Open "SQLDSN", "test", "test123" 
    Set rs = cn.Execute(sql) ' likely, in your case, to return one record only, _ 
           so you are on there right away 
    For i = 0 To rs.Fields.Count 
     ws.Cells(n, i + 1) = rs(i) 
    Next 
    rs.Close 
    cn.Close 
End Sub 

您將需要投入更多的工作到這一點,我很害怕,但這是你可能會考慮的方向。

相關問題