请记住,我对VBA编码很陌生
问题:
我在Excel 2013中有一个SQL提取,它完美地运行。但是,目前数据是硬编码的,应该放在哪里。问题是每当添加新行时,硬编码都不起作用。
该数据位于包含相关员工的表格下方,该表格对数据进行求和,使我能够将其发送到工作簿中的其他位置。但是,如果添加新员工,则由于数据放置的硬编码,数据将无法正确放置。我可以创建另一张表,但这不是理想的。
我正在寻找的是一段代码,它自动(动态)找到数据区中的第一个空行和列,然后在该位置插入数据。因此,第一个数据应该放在A列的第一个可用行中。下次我提取数据时,它应该进入D列的第一个可用行,依此类推。
要在数据区域上显示图片,其中一个标题位于A31区域:CE31,而另一个是A26:AJ26 - 这一切都取决于我提取的列数(基于大约12个月,所以相同每个月的列数)
代码:
我在网上看了一会儿,试图找出要做的事情。到目前为止,我有以下代码 - 我还提出了我以前的硬编码公式,因此您可以了解所需的内容。另外请记住代码包含更多,但一切正常,我只需要改变这一点。
Dim LRow As Long
Dim LCol As Long
LRow = Cells(Rows.Count, "A").End(xlUp).Row
LCol = Cells(LRow, Columns.Count).End(xlToLeft).Column
**SQL Extract happening here**
If Not rs.EOF Then
If Range("A" & LRow + 1).Value = "" Then
ActiveWorkbook.ActiveSheet.Range("A" & LRow + 1).CopyFromRecordset rs
ElseIf Range("D10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("D10").CopyFromRecordset rs
ElseIf Range("G10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("G10").CopyFromRecordset rs
ElseIf Range("J10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("J10").CopyFromRecordset rs
ElseIf Range("M10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("M10").CopyFromRecordset rs
ElseIf Range("P10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("P10").CopyFromRecordset rs
ElseIf Range("S10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("S10").CopyFromRecordset rs
ElseIf Range("V10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("V10").CopyFromRecordset rs
ElseIf Range("Y10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("Y10").CopyFromRecordset rs
ElseIf Range("AB10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("AB10").CopyFromRecordset rs
ElseIf Range("AE10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("AE10").CopyFromRecordset rs
ElseIf Range("AH10").Value = "" Then
ActiveWorkbook.ActiveSheet.Range("AH10").CopyFromRecordset rs
End If
rs.Close
Else
MsgBox "Error: No records returned.", vbCritical
End If
我不知道我是否正确编码,以及如何继续前进。数据的第一个输入正常工作,因为它正确地找到了A列中的最后一行 - 但我无法弄清楚如何从那里继续前进。任何帮助将不胜感激。我认为这并不复杂。
修改
我想避免任何形式的引用特定行或列。我希望它自动找到下一个空的,然后插入数据 - 我不知道编码该部分的后续步骤
答案 0 :(得分:0)
这样的事情可能是:
Dim c As Range, sht as Worksheet
Set sht = ActiveSheet
Set c = sht.Cells(sht.Rows.Count, "A").End(xlUp)
'Locate the first empty "slot"
Do While Len(c.Value) > 0 '<<<<EDIT
Set c = c.Offset(0, 3)
'wrap back and one row down if full row
If c.Column > 43 Then Set c = sht.Cells(c.Row + 1, 1)
Loop
**SQL Extract happening here**
If Not rs.EOF Then
c.CopyFromRecordset rs
Else
MsgBox "Error: No records returned.", vbCritical
End If
rs.Close '<< still need to close even if no records returned...