在VBA

时间:2018-04-10 11:21:17

标签: excel vba excel-vba

请记住,我对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列中的最后一行 - 但我无法弄清楚如何从那里继续前进。任何帮助将不胜感激。我认为这并不复杂。

修改

我想避免任何形式的引用特定行或列。我希望它自动找到下一个空的,然后插入数据 - 我不知道编码该部分的后续步骤

1 个答案:

答案 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...