【问题标题】:Shift Excel Cell down after executing a macro for second time第二次执行宏后向下移动 Excel 单元格
【发布时间】:2015-01-06 21:31:04
【问题描述】:

我编写了一个(如下)宏,用于从 sql server 2008 r2 中提取数据。我的问题是当用户通过输入 Jobnumber(比如 J0001)第一次运行宏时,excel 会将数据从单元格“A1”开始放在电子表格上,这很好。这里的问题是,当用户通过输入作业编号(例如 J0002)第二次运行宏时,excel 将作业编号(J0002)的数据放在单元格“A1”上,并将 J0001(第一个作业)的单元格移动到单元格“F”而不是向下移动。如何在电子表格中将上一个条目向下移动,最新条目位于顶部?

这是我的宏和附件:

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]

【问题讨论】:

  • 这就是 QueryTable 的作用。当您刷新它时,它会用新数据替换旧数据(它会刷新!)。我真正想知道的是为什么它不会覆盖旧数据而是将其移到一边?也许是因为您每次运行代码时都添加了一个新的 QueryTable?无论如何,退出使用 QueryTables 并将查询结果放入记录集中并将记录写入您希望的位置。
  • @GeneSkuratovsky - 我是 Excel VBA 的新手。如果您能帮助我处理当前宏的记录集,我将不胜感激。
  • 发生这种情况是因为这段代码:Destination:=Range("a1"
  • Range("A1000") 发生了什么?

标签: vba excel


【解决方案1】:

如果您合并 lastRow 检查,然后为变量分配 Next Row 编号,您可以连接您的 Range 并且每次都会是一个新行。

Dim lastRow As Long, nextRow As Long

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

然后,当您设置 Range 时,将变量与字符串连接起来。

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

我不确定您对第 1000 行做了什么,如您的问题所示。但这是使用具有正常范围地址的变量的想法。

【讨论】:

  • @Gene Skuratovsky- 感谢您的帮助
【解决方案2】:

你可以有这样的东西:

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

恐怕你需要做更多的工作,但这是你可以考虑的方向。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多