【问题标题】:VBA Autorange function for Array to Range in excelexcel中数组到范围的VBA自动范围功能
【发布时间】:2018-05-23 12:11:31
【问题描述】:

在处理大型 csv 文件时,我决定将它们加载到 VBA 内存中,而不是加载到我的电子表格中,以使其更快更轻。

所以我有一个函数 CSVtoArray,它可以读取我的 CSV 并给我一个数组。

如果我仍然想在 excel 中查看我的数据,我只需在我的 s/s 中写入 {=(CSVtoArray(my_csv_path)}。

但由于我的 csv 大小会随时间而变化,我想编写一个名为 AutoRange 的函数,它会根据我的范围大小自动适应电子表格中的显示区域。

这就是我写的,但它不起作用,它什么也不做,只有我正在编写公式的单元格被填充。

    Function AutoRange(my_array As Variant)

        Dim nb_rows, nb_cols As Integer
        Dim current_cell, target_range As Range

        nb_rows = UBound(my_array, 1)
        nb_cols = UBound(my_array, 2)

        Set current_cell = Selection

        current_cell.Resize(nb_rows, nb_cols).FormulaArray = current_cell.Formula

        AutoRange = Selection

    End Function

提前谢谢各位。

【问题讨论】:

  • 我认为这是一个双重职位stackoverflow.com/questions/12259595/…
  • 嗯不,实际上这是之后的步骤。我已经阅读了 CSV,它存储在我的内存中,现在我想在电子表格中显示它。

标签: vba excel


【解决方案1】:

函数用于返回东西。如果在单元格中使用是为了将东西返回到该单元格,而不是操纵其他单元格。你真的想要一个子喜欢吗?

代码:

Option Explicit
Public Sub TEST()

    Dim my_Array()
    my_Array = [A1].CurrentRegion.Value

    AutoRange my_Array

End Sub

Public Sub AutoRange(ByVal my_Array As Variant)

    Dim nb_rows As Long, nb_cols As Long
    Dim current_cell As Range

    nb_rows = UBound(my_Array, 1)
    nb_cols = UBound(my_Array, 2)

    Set current_cell = Selection

    current_cell.Resize(nb_rows, nb_cols).FormulaArray = current_cell.Formula

End Sub

结果:

来自您的 cmets:如果您想用作函数(不是 UDF,它不能更改其他单元格),那么您可以使用以下方式,但我建议不要这样做,因为它是不好的做法:

Option Explicit
Public Sub TEST()

    Dim my_Array()
    my_Array = [A1].CurrentRegion.Value
    Dim target_Range As Range
    Set target_Range = AutoRange(my_Array)

End Sub

Public Function AutoRange(ByVal my_Array As Variant) As Range

    Dim nb_rows, nb_cols As Long
    Dim current_cell, target_Range As Range

    nb_rows = UBound(my_Array, 1)
    nb_cols = UBound(my_Array, 2)

    Set current_cell = Selection
    Set target_Range = current_cell.Resize(nb_rows, nb_cols)
    Set AutoRange = target_Range

    target_Range.FormulaArray = current_cell.Formula

End Function

【讨论】:

  • 是的,这就是我对退货错误的看法。子可以做,但我希望它作为像“=AutoRange(CSVtoArray(my_csv_path))”这样的函数,我将在单元格中输入并自动扩展。我知道这是可以做到的,因为在我以前的工作中,IT 团队构建了一个,但我从未注意查看代码.....
  • 所以也许像上面那样实现。
  • 你是怎么调用这个函数的?您不能在单元格中使用它。
  • 好的,我想我得到了答案,从这里link。 “从工作表单元格调用的函数只能影响调用它的单元格的内容/外观。”所以我想我需要另一种方法来做到这一点。
  • 我在上面的回答中已经告诉过你两次了。所以那个答案其实是我的答案。见上文①“用于单元格中是为了将东西返回到那个单元格,而不是操纵其他单元格”; ②“不是UDF,不能改变其他单元格”。然后,我继续向您展示如何绕过它。大声笑。
【解决方案2】:

好吧,我换个方式,

我有我的 AutoRange 子:

    Sub AutoRange(my_Array As Variant, top_left_corner As Range)
        ' Here we take an array in input, the one we want to display, and the top left corner of the range where we want to put it

    Dim nb_rows, nb_cols As Integer

    nb_rows = UBound(my_Array, 1)
    nb_cols = UBound(my_Array, 2)

    Set current_cell = top_left_corner

    top_left_corner.Resize(nb_rows, nb_cols).FormulaArray = top_left_corner.Formula

    End Sub

然后我在我的 s/s 中添加了一个 Worksheet_change 子:

    Private Sub Worksheet_Change(ByVal Target As Range)
        If Target.Address = "$A$1" Then
            if Target.value="load data" then
                Call Autorange(my_array, my_range)
            else
                Range(my_range, my_range.End(xlDown).End(xlToRight)).clearcontents
        End If
    End Sub

所以我只需要说我是否要加载我的数据,它会调整。

我假设在我以前的公司,他们使用的是插件而不是 VBA 本身。

无论如何,谢谢各位。 干杯

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多