将下一个空的多单元格范围分配给函数返回的变量

Posted

技术标签:

【中文标题】将下一个空的多单元格范围分配给函数返回的变量【英文标题】:Assigning Next Empty Multi-cell Range to Variable Returned by Function 【发布时间】:2015-05-14 18:34:58 【问题描述】:

我正在尝试使用一个函数来使用工作表中的下一个空行返回一个大小仅为 1 x 4 的 Range 对象,这样我就可以在不同的工作表上将值从一个范围传输到另一个范围。不幸的是,我似乎无法弄清楚这一点。我试图寻找答案,但我只能找到 1 个细胞的解决方案。

Private Function AssignNextRow(project As String) As Range

    Dim projectSheet As Worksheet
    Set projectSheet = Worksheets(project)
    Dim firstEmptyRow As Range
    Set firstEmptyRow = projectSheet.Range(Cells("A" & projectSheet.Rows.count) _
      .End(xlUp).Offset(1, 0), Cells("D" & projectSheet.Rows.count).End(xlUp).Offset(1, 0))
    AssignNextRow = firstEmptyRow

End Function

那么将 Range 设置为变量的最佳方法是什么?

编辑:

我已经修复了它将运行的代码,但现在下一张工作表的范围开始偏移,以在最后一张工作表的范围结束时开始。新代码如下:

Private Function AssignNextRow(project As String) As Range

    Dim projectSheet As Worksheet
    Set projectSheet = Worksheets(project)
    Dim firstEmptyRow As Range
    Set firstEmptyRow = projectSheet.Range("A" & projectSheet.Rows.count) _
      .End(xlUp).Offset(1, 0).Resize(1, 4)
    Set AssignNextRow = firstEmptyRow

End Function

我不确定在哪里解决这个问题。

第二次编辑:

究竟什么是“下一张”和“最后一张”?您可能需要提供调用 AssignNextRow() -Tim Williams 的代码

Private Sub DailyTransfer()
    Dim dailyRange As Variant
    dailyRange = Worksheets("Daily").Range("A3:D23").Value
    Dim x As Integer, y As Integer, z As Integer, projectName As String
    Dim entryDate As Date
    x = 1
    y = 1
    z = 1
    For x = 1 To 20
        projectName = dailyRange(x, 2)
        entryDate = dailyRange(x, 1)
        If projectName = "" Then Exit For
        If WkshtCheck(projectName) = False Then Call WkshtMake(projectName, entryDate)
        For y = 1 To 4
            Dim emptyRow As Range
            Set emptyRow = AssignNextRow(projectName)
            emptyRow(1, z).Value = dailyRange(x, y)
            If y = 1 Then y = y + 1
            z = z + 1
        Next y
    Next x
End Sub

【问题讨论】:

目前究竟有什么不适合您?是否抛出异常?哪条线路导致了问题? 您在 UDF() 的最后一行缺少一个 Set 谢谢@Gary 的学生。我也解决了这个问题。 你真的需要每次通过内部(y)循环重新分配emptyRow吗? 你是对的。我最初在“x”循环中使用它,但出于某种奇怪的原因我切换了它。我不记得为什么......无论如何,它仍然是偏移量。 【参考方案1】:

只要 ColA 中始终存在值,就应该这样做

Set firstEmptyRow = projectSheet.Range(Cells("A" & projectSheet.Rows.count) _
  .End(xlUp).Offset(1, 0).Resize(1,4)

【讨论】:

.调整大小!谢谢!用这个我差点把头发拉出来! 小问题。它在下一张纸上偏移自己,从最后一张纸结束的地方开始。有点奇怪…… “下一张”和“最后一张”到底是什么?您可能需要提供调用 AssignNextRow 的代码

以上是关于将下一个空的多单元格范围分配给函数返回的变量的主要内容,如果未能解决你的问题,请参考以下文章

VBA,语法,将单元格范围组合在一起以获取公共变量

使用单元格值作为单元格范围进行计算

jquery表格中鼠标按下,选择单元格范围的事件

跨多个工作表的 VBA 宏

将单元格内的任何单词与单元格范围内的任何单词匹配

显示单元格范围的 IF 公式