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