写入给定列的下一个可用单元格

时间:2017-10-31 23:12:31

标签: excel vba excel-vba

我有一个简单的宏,但我生锈了,因为我几年没有编码。就像我可以说的那样,我有两个不同的工作簿。如果我打开的工作簿具有某个值(或没有值),我希望它用“提议或提议前”填充其他工作簿(“测试模板”)。 对我来说这一切都很容易。但是由于工作表在我们输入数据时添加了行,我需要它在下一个可用行中填充这些值。

我会附加代码,但不要担心提案内容,我只需要将范围从特定单元格更改为列中的下一个可用单元格。 (如果d28已满,请输入d29)。

Here is a screenshot of code and the two workbooks

Public Sub foo()

Dim x As Workbook
Dim y As Workbook

'## Open both workbooks first:
Set x = ActiveWorkbook
Set y = Workbooks.Open("C:\Users\hmaggio\Desktop\Test Template.xlsx")




'copy Names from x(active):
x.Sheets("Sheet1").Range("C4").Copy

'paste to y worksheet(template):
y.Sheets("Sheet1").Range("B28").PasteSpecial



If x.Sheets("Sheet1").Range("C15") = "" Then
y.Sheets("Sheet1").Range("D28").Value = "proposal"
Else

y.Sheets("Sheet1").Range("D28").Value = "preproposal"


End If

3 个答案:

答案 0 :(得分:0)

对象Range提供了一个名为End的方法,它返回某个方向的最后一个范围。

Range("A1").End(xlDown) '<-- returns the last non-empty range going down from cell A1
Range("A1").End(xlUp) '<-- same, but going up
Range("A1").End(xlToRight) '<-- same, but going right
Range("A2").End(xlToLeft) '<-- same, but going left

因此,在您的情况下,您可以检测并使用列B的最后一行,如下所示:

nextRow = y.Sheets("Sheet1").Range("B3").End(xlDown).Row + 1

更多详情

  • 列B的第一个范围是标题Range("B3")
  • 您使用.End(xlDown)
  • 获得最后一个填充范围
  • 具体而言,您获得该范围的Row
  • 您添加+ 1(因为您想要下一个可用的行
  • 您将行存储在变量nextRow

...然后你可以像这样使用:

y.Sheets("Sheet1").Range("B" & nextRow ).PasteSpecial

答案 1 :(得分:0)

首先,您需要一个变量,您将存储最后使用的行号:

dim lngRows as long
lngRows = Cells(Rows.Count, "D").End(xlUp).Row

然后使用.Range("B28").Cells(lngRows+1,2)

替换您.Range("B"&lngRows)所在的代码行

答案 2 :(得分:0)

试试这个

Public Sub foo()

    Dim x As Workbook
    Dim y As Workbook
    Dim fromWs As Worksheet
    Dim toWs As Worksheet
    Dim Target As Range

    '## Open both workbooks first:
    Set x = ActiveWorkbook
    Set y = Workbooks.Open("C:\Users\hmaggio\Desktop\Test Template.xlsx")


    Set fromWs = x.Sheets("Sheet1")
    Set toWs = y.Sheets("Sheet1")

    With fromWs
        Set Target = toWs.Range("b" & Rows.Count).End(xlUp)(2) '<~~next row Column B cell
        Target = .Range("c4") 'Column B
        If .Range("c15") = "" Then
            Target.Offset(, 2) = "proposal" 'Column D
        Else
            Target.Offset(, 2) = "preproposal"
        End If
    End With

End Sub