Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
excel中数组到范围的VBA自动范围函数_Vba_Excel - Fatal编程技术网

excel中数组到范围的VBA自动范围函数

excel中数组到范围的VBA自动范围函数,vba,excel,Vba,Excel,当我处理大型csv文件时,我决定将它们加载到VBA内存中,而不是加载到电子表格中,以使其更快、更轻 所以我有一个函数CSVtoArray,它读取我的CSV并给我一个数组 然后,如果我仍然想在excel中查看数据,我只需在s/s中写入{=(CSVtoArray(my_csv_path)} 但是,由于我的csv的大小随着时间的推移而变化,我想编写一个名为AutoRange的函数,该函数将根据我的范围大小自动适应电子表格中的显示区域 这就是我写的,但它不起作用,它什么也不做,只有我写公式的单元格被填满

当我处理大型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

提前感谢各位。

函数用于返回内容。如果在单元格中使用,则用于将内容返回到该单元格,而不是操纵其他单元格。是否确实需要类似的子单元格

代码:

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
结果:

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

根据您的评论:如果您想将其用作函数(而不是UDF,因为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

好吧,我用另一种方式

我有我的自动量程分接头:

    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中添加了一个工作表\u change sub:

    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本身

谢谢你们。
干杯

我认为这是一个双后哼唱不,实际上这是之后的步骤。我已经阅读了CSV,它存储在我的内存中,现在我想在电子表格中显示它。是的,这是我关于返回错误的想法。sub可以,但我希望它作为一个函数,如“=自动范围(CSVtoArray(my_CSV_path))”我会在一个单元格中输入并自动扩展。我知道这是可以做到的,因为在我以前的工作中,it团队构建了一个,但我从来没有注意过查看代码……所以可能会如上所述实现。你如何调用此函数?你不能在单元格中使用它。好吧,我想我从这里得到了我的答案。“从工作表单元格调用的函数只能影响调用该函数的单元格的内容/外观。”因此,我想我需要找到另一种方法来实现它。我在上面的回答中已经告诉过你两次了。因此,这个答案实际上就是我的答案。请参见上文① "“在单元格中用于将内容返回到该单元格,而不是操纵其他单元格”;② “不是UDF,它不能改变其他细胞。”然后我继续向你展示如何绕过它。哈哈。