2015-01-06 59 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 

您将需要投入更多的工作到这一点,我很害怕,但这是你可能会考虑的方向。

相关问题