Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
为数组vba赋值_Vba_Excel - Fatal编程技术网

为数组vba赋值

为数组vba赋值,vba,excel,Vba,Excel,我没有在VBA中使用数组的经验,所以我迷路了。我尝试做的是以下几点: 在A列中,我有15个字符串(数字不是固定的,有时更多,有时更少) 我删除重复项,然后为A列中的每个名称在文件中创建单独的工作表 我创建了一个数组,我尝试使用此循环为其中的每个名称分配名称: Sub assigningvalues() Dim i As Integer Dim myArray(20) As Variant Dim finalrow As Long ActiveSheet.Range("A1", Range("

我没有在VBA中使用数组的经验,所以我迷路了。我尝试做的是以下几点:

在A列中,我有15个字符串(数字不是固定的,有时更多,有时更少)

我删除重复项,然后为A列中的每个名称在文件中创建单独的工作表

我创建了一个数组,我尝试使用此循环为其中的每个名称分配名称:

Sub assigningvalues()

Dim i As Integer
Dim myArray(20) As Variant
Dim finalrow As Long

ActiveSheet.Range("A1", Range("A1").End(xlDown)).RemoveDuplicates Columns:=Array(1)

finalrow = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlDown).Row

'For i = 2 To finalrow -> I get overflow error when I use this range   
For i = 2 To Cells(20, 1)  
    myArray(i) = Cells(i, 1).Value    
Next i

'I check with the lines below if values were assigned    
Cells(2, 4).Value = myArray(4)
Cells(3, 4).Value = myArray(2)

End Sub
但是,要指定的单元格中的值不会指定给数组

此外,当我尝试使用
finalrow
作为循环的范围时,我会得到溢出错误(这不是一个大问题,因为有解决方法,尽管知道我做错了什么会很好)

尝试下面的代码:

Option Explicit

Sub assigningvalues()

Dim i As Long
Dim myArray(20) As Variant
Dim FinalRow As Long
Dim Sht As Worksheet

Set Sht = ThisWorkbook.Sheets("Sheet1") ' modify "Sheet1" to your sheet's name

With Sht
    .Range("A1", .Range("A1").End(xlDown)).RemoveDuplicates Columns:=Array(1)

    FinalRow = .Cells(.Rows.Count, "A").End(xlUp).Row ' get last row in column "A"

    For i = 2 To FinalRow
        myArray(i) = Cells(i, 1).Value
    Next i

    'I check with the lines below if values were assigned
    .Cells(2, 4).Value = myArray(4)
    .Cells(3, 4).Value = myArray(2)
End With

End Sub
注意:您可以使用
应用程序将
范围
的内容读取到一维数组,而无需
For
循环。转置
,您需要将定义它的行更改为:

Dim myArray As Variant
并使用以下命令填充整个阵列:

myArray = Application.Transpose(.Range("A2:A" & FinalRow))
请尝试以下代码:

Option Explicit

Sub assigningvalues()

Dim i As Long
Dim myArray(20) As Variant
Dim FinalRow As Long
Dim Sht As Worksheet

Set Sht = ThisWorkbook.Sheets("Sheet1") ' modify "Sheet1" to your sheet's name

With Sht
    .Range("A1", .Range("A1").End(xlDown)).RemoveDuplicates Columns:=Array(1)

    FinalRow = .Cells(.Rows.Count, "A").End(xlUp).Row ' get last row in column "A"

    For i = 2 To FinalRow
        myArray(i) = Cells(i, 1).Value
    Next i

    'I check with the lines below if values were assigned
    .Cells(2, 4).Value = myArray(4)
    .Cells(3, 4).Value = myArray(2)
End With

End Sub
注意:您可以使用
应用程序将
范围
的内容读取到一维数组,而无需
For
循环。转置
,您需要将定义它的行更改为:

Dim myArray As Variant
并使用以下命令填充整个阵列:

myArray = Application.Transpose(.Range("A2:A" & FinalRow))
请尝试以下代码:

    Sub assigningvalues()

    Dim myArray As Variant
    ActiveSheet.Range("A1", Range("A1").End(xlDown)).RemoveDuplicates Columns:=Array(1)

    myArray = ActiveSheet.Range("A1", Range("A1").End(xlDown))


    For Each element In myArray
        ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = element
    Next element

End Sub
注意:上述代码的问题是

ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlDown).Row 
返回工作表中的绝对行数,而不是已使用的行数。因为你的阵列有20米长,而片长约为1米。行,您有一个溢出。您可以使用

Debug.Print ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlDown).Row
在上面的代码中,在删除dublicates之后,再次从
A1
向下走到末尾,并将范围保存到数组中。数组
myArray
现在包含缩小范围内的所有单元格值

现在,使用

For Each element in myArray
并使用
Workbook.Sheets创建一个新的工作表。添加
并将名称指定给我的设置
Sheets(index)。name=element

上面的代码应该适合您。几句话:

不要使用
“ActiveSheet”、此工作簿等。
您应该始终使用以下内容启动子项:

Dim wb As Workbook
Set wb = ThisWorkbook 'for the workbook containing the code
Set wb = Workbooks(workbookName) 'to reference an other Workbook

'And for all the sheets you are using
Dim ws As Worksheet
Set ws = wb.Sheets(sheetName) 'this way you avoid problems with multiple 
                               workbooks that are open and active or 
                               unactive sheets.
请尝试以下代码:

    Sub assigningvalues()

    Dim myArray As Variant
    ActiveSheet.Range("A1", Range("A1").End(xlDown)).RemoveDuplicates Columns:=Array(1)

    myArray = ActiveSheet.Range("A1", Range("A1").End(xlDown))


    For Each element In myArray
        ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)).Name = element
    Next element

End Sub
注意:上述代码的问题是

ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlDown).Row 
返回工作表中的绝对行数,而不是已使用的行数。因为你的阵列有20米长,而片长约为1米。行,您有一个溢出。您可以使用

Debug.Print ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlDown).Row
在上面的代码中,在删除dublicates之后,再次从
A1
向下走到末尾,并将范围保存到数组中。数组
myArray
现在包含缩小范围内的所有单元格值

现在,使用

For Each element in myArray
并使用
Workbook.Sheets创建一个新的工作表。添加
并将名称指定给我的设置
Sheets(index)。name=element

上面的代码应该适合您。几句话:

不要使用
“ActiveSheet”、此工作簿等。
您应该始终使用以下内容启动子项:

Dim wb As Workbook
Set wb = ThisWorkbook 'for the workbook containing the code
Set wb = Workbooks(workbookName) 'to reference an other Workbook

'And for all the sheets you are using
Dim ws As Worksheet
Set ws = wb.Sheets(sheetName) 'this way you avoid problems with multiple 
                               workbooks that are open and active or 
                               unactive sheets.

很好的教程内容(+1)谢谢你的答案和提示。我将在未来使用它。很好的教程内容(+1)谢谢你的答案和提示。我将在未来使用它,谢谢你。我会记住你的建议:)谢谢你,弗洛利。我会记住你的建议:)