Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.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
Arrays VBA数组输出到Excel工作表_Arrays_Excel_Vba - Fatal编程技术网

Arrays VBA数组输出到Excel工作表

Arrays VBA数组输出到Excel工作表,arrays,excel,vba,Arrays,Excel,Vba,我遇到了一个问题,虽然很简单,但很棘手,我有一个单元格中的字符串,我使用Mid函数将字符串拆分为字符,并将其存储到数组中。现在我想将数组打印到不同的范围,但我无法执行此操作。我试过很多不同的密码,但都是用静脉注射的。 请帮忙 我的代码是 Option Base 1 Function Takseer(Rg As Variant) Dim NewArray() As Variant Dim StrEx As String Dim k, l, m As Integer

我遇到了一个问题,虽然很简单,但很棘手,我有一个单元格中的字符串,我使用Mid函数将字符串拆分为字符,并将其存储到数组中。现在我想将数组打印到不同的范围,但我无法执行此操作。我试过很多不同的密码,但都是用静脉注射的。 请帮忙

我的代码是

Option Base 1
Function Takseer(Rg As Variant)
    Dim NewArray() As Variant
    Dim StrEx As String
    Dim k, l, m  As Integer
    StrEx = Rg
    StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
    m = Len(StrEx)
    For k = 1 To m
        ReDim Preserve NewArray(1 To m)
            NewArray(k) = Mid(StrEx, k, 1)
    Next k
    Range("C1:C12") = NewArray

End Function

假设您获得的数组是“苹果”、“橘子”、“葡萄”、“榴莲”,为了写入工作表,您不能直接调用变量。写入值的一种方法是首先获取变量的长度,然后从索引0开始从数组中写入值,下面是我如何执行的:

    Sub test1()

    Dim NewArray() As Variant
    Dim i As Long, arrayLoop As Long
    Dim StrEx As String
    Dim k, l, m  As Integer
    
    StrEx = "Hello today is my first day"
    StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
    m = Len(StrEx)
    
    For k = 0 To m - 1
       ReDim Preserve NewArray(m - 1)
            NewArray(k) = Mid(StrEx, k + 1, 1)
    Next k

    
    i = UBound(NewArray) - LBound(NewArray) + 1

    For arrayLoop = 0 To i - 1
        Sheet1.Range("A" & arrayLoop + 1).Value = NewArray(arrayLoop)
    Next

End Sub
执行数组循环时请注意,必须将长度减1,否则将超出范围,原因是数组索引始终从零开始(0)


并查看如何获取数组长度的帖子

您必须将数组转置以将值放入列中

选项显式
选项基数1
子测试()
呼叫Takseer(“ABCDEFGHUIJKL”)
端接头
函数Takseer(StrEx作为字符串)
Dim NewArray()作为变量,s作为字符串,m作为整数,k作为整数
s=替换(StrEx,“,”)
m=Len(s)
如果m=0,则退出函数
ReDim新阵列(m)
对于k=1到m
新数组(k)=中间(s,k,1)
下一个k
“一排
表1.范围(“C1”)。调整大小(1,m)=新数组
"一栏,
Sheet1.Range(“C2”).Resize(m,1)=工作表函数.Transpose(新数组)
端函数

您的功能存在一些问题:

  • 公式返回一个值。它不用于更改工作表的其他属性/单元格。
    • 因此,您应该将结果设置为函数;不要尝试写入范围
  • Dim k、l、m作为整数
    仅声明
    m
    Integer
    k
    l
    未指定,因此它们将被声明为变量
  • 构建的阵列将是水平的。如果希望结果垂直,则需要对其进行转置,或者最初创建一个二维数组
  • 选项Base 1是不必要的,因为您显式声明了下限
假设您想在工作表上使用此函数,
TestIt
进行设置

注2:工作表上的公式假设您有带动态数组的Excel。如果您有早期版本的Excel,则需要使用不同的工作表公式

Option Explicit
Function Takseer(Rg As Variant)
    Dim NewArray() As Variant
    Dim StrEx As String
    Dim k As Long, l As Long, m  As Long
    StrEx = Rg
    StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
    m = Len(StrEx)
    For k = 1 To m
        ReDim Preserve NewArray(1 To m)
            NewArray(k) = Mid(StrEx, k, 1)
    Next k
    Takseer = NewArray

End Function

Sub TestIt()
    [a1] = "abcdefg"
    [c1].EntireColumn.Clear
    [c1].Formula2 = "=Transpose(Takseer(A1))"
End Sub
查看修改后的函数和测试:

修改,将转置添加到工作表公式中

Option Explicit
Function Takseer(Rg As Variant)
    Dim NewArray() As Variant
    Dim StrEx As String
    Dim k As Long, l As Long, m  As Long
    StrEx = Rg
    StrEx = WorksheetFunction.Substitute(StrEx, " ", "")
    m = Len(StrEx)
    For k = 1 To m
        ReDim Preserve NewArray(1 To m)
            NewArray(k) = Mid(StrEx, k, 1)
    Next k
    Takseer = NewArray

End Function

Sub TestIt()
    [a1] = "abcdefg"
    [c1].EntireColumn.Clear
    [c1].Formula2 = "=Transpose(Takseer(A1))"
End Sub
修改以创建二维垂直阵列 无法在此阵列上真正使用
redim preserve
。无论如何,我宁愿避免它,因为它的开销

注意:

  • TestIt
    只是测试功能。您应该自己手动或以编程方式将适当的公式输入目标范围
  • 如果没有动态数组,则需要在目标范围中输入数组公式;或者使用
    INDEX
    函数返回数组的每个元素的公式
  • TestIt
    中,您可以将放置公式到工作表上的行更改为
    范围(单元格(1,3),单元格(Len([a1]),3))。FormulaArray=“=Takseer(a1)”
    ,但是,您仍然可以手动或编程方式将正确的公式输入工作表


您的代码是做什么的?这是怎么回事?事实上,这是一个很长的程序,我想拆分一个字符串,然后将其存储在数组中,然后将数组粘贴到工作表中,然后获取数组并执行计算,然后再次将其显示在屏幕上等等。到目前为止还没有打印backArray在打印到即时窗口时保留编码的值,但到目前为止无法将值打印到excel在将值复制到excel之前仍无法获取代码上的outputAdd断点,请右键单击newarrayK并添加到观察列表,以检查其是否正确存储为数组。我担心您的新数组出于某种原因是空的,数组存储值,甚至在即时窗口中显示。我已经为您修改了我的原始代码,如果您仍然无法工作,我无法帮助您解决问题,谢谢。每样东西都很好,但还是不能打印出来。对不起,我拿不到you@Imran该函数是否在工作簿、工作表或模块中?您如何调用该函数?该函数是否与要打印到的区域位于同一工作簿中?没有工作表引用的Range()将打印到活动工作表。此函数位于模块中,是的,没有工作表引用的情况下您是对的。它应将其打印到活动工作表。但是我无法得到它,所以我非常感谢你。它工作了,但使用了一个常量字符串。无法使用单元格引用完成此操作。我很感谢你的帮助。“我得到的错误对象不支持此属性或方法。@ImRange我看不到您的屏幕。”。如果不知道您使用的是哪个代码版本,也不知道错误所指的是哪一行,我不知道如何提供帮助。显然,从屏幕截图上看,这两个版本在这里都有效。@imrange我猜测您的错误发生在
子部分,而不是
函数中。如果是这种情况,它可能与
公式2
属性有关。如果是这样,您可能没有动态数组。请重新阅读我的笔记2,以及我的最后一张,刚刚在我答案底部添加的笔记。另外,请阅读Excel版的Microsoft帮助以了解数组公式。非常感谢,现在它可以正常运行了。但是当我手动操作时,它只打印第一个字母是的,错误就在sub中,而不是在函数中。