【问题标题】:How to make a list of values from an array (2 columns) based on one criteria?如何根据一个标准从数组(2列)中创建一个值列表?
【发布时间】:2019-07-16 21:55:45
【问题描述】:

我有以下数组:

ID        Chat nr
           #N/A
126551829   33
126554922   33
126555078   33
126555079   33
126555261   33
126555278   33
126553808   34
126553820   34
126554425   35
126555786   36
126555925   36
126555944   36
126556297   37
126556298   37
126556299   37
126556300   37
126556307   37
126556320   37
126556322   37
126556323   37
126556323   37
126556323   37
126556323   37
126556325   37
126556332   37
           #N/A
           #N/A
           #N/A
etc...

此数据位于名为“导入”的工作表中。在名为“仪表板”的工作表中,我有下拉列表,工作表的用户可以在其中选择聊天 nr。例如,如果用户选择 36,我想要此宏的以下输出(ID):

126555786   
126555925   
126555944   

我尝试编写代码,但我的代码返回数组中的所有值,而不仅仅是带有“36”的值。此外,我在“导入”表中的聊天号码列中有公式。

Private Sub CommandButton2_Click()

Dim xRng As Range
Dim xLastRow As Long
Dim xLastRow2 As Long
Dim i As Integer
On Error Resume Next

Set xRng = Worksheets("Import").Range(Range("B18"))
If xRng(, 2).Value = Worksheets("Dashboard").Range("B9").Value Then
xRng.Copy Range("F6")
xLastRow = xRng.Rows.Count + 1
ActiveSheet.Range("F6:F" & xLastRow).RemoveDuplicates Columns:=1, Header:=xlNo
End If

End Sub

代码中的单元格说明:

  • B18 包含数组的名称。我需要间接地做到这一点。
  • B9 包含我要显示的聊天号码(在本例中为 36)
  • F6 是输出范围中的第一个输出单元格。我希望这个范围是动态的。

我花了很多时间试图弄清楚这一点,但没有任何运气......我是 VBA 编码的新手,但我渴望学习。我当然会赞扬好的答案!

【问题讨论】:

  • 如果您不知道自己在做什么,请不要使用On Error Resume Next
  • "...表单的用户可以选择聊天 ID。例如,如果用户选择 36..." 我相信他们选择了聊天编号。 ,而不是 ID
  • 好的,但是你对编码有什么建议吗?
  • 谢谢蒂姆!我的错误
  • 正在努力

标签: arrays excel vba arraylist


【解决方案1】:

你可以试试这段代码(现在它会先删除之前运行的输出):

Private Sub CommandButton2_Click()

Dim xRng As Range
Dim oRng As Range ' Output range
Dim iWS As Worksheet, dWS As Worksheet
Dim ChatNr As Long
Dim i As Integer, j As Integer
Dim LastRow As Long

Set iWS = ThisWorkbook.Sheets("Import")
Set dWS = ThisWorkbook.Sheets("Dashboard")
ChatNr = dWS.Cells(9, 2) ' cell B9

Set xRng = iWS.Range(dWS.Cells(18, 2).Value) ' cell B18, assuming the array name is defined in the scope of the iWS
Set oRng = dWS.Cells(6, 6) ' output in cell F6
LastRow = dWS.Cells(dWS.Rows.Count, 6).End(xlUp).Row
' clear previous output:
If LastRow >= 6 Then
    Range(dWS.Cells(6, 6), dWS.Cells(LastRow, 6)).ClearContents
End If
j = 0

For i = 1 To xRng.Rows.Count
    If IsError(xRng(i, 2)) = False Then ' added check for error
        If xRng(i, 2).Value = ChatNr Then
            oRng.Offset(j).Value = xRng(i, 1).Value
            j = j + 1
        End If
    End If
Next i

End Sub

【讨论】:

  • 如果 Tim 的代码不起作用,将对此进行调查。谢谢!
  • 运行时错误 1004 在行:Set xRng = Range(dWS.Cells(18, 2).Value)
  • @Jan 已更新。我的假设是名称的范围是Workbook。看看你是否仍然得到错误。此代码在将范围更改为 Import 时有效。
  • 谢谢。以下行的新错误消息: If xRng(i, 2).Value = ChatNr Then
  • 仅供参考,“仪表板”中 B18 中的“Array1”指的是“导入”中的 B21:C3499。行号将始终相同。即对于 Array2,我们有 N21:O3499。
【解决方案2】:

试试下面的。确保在尝试任何代码之前备份所有(关键)数据

Option Explicit

Private Sub CommandButton2_Click()
Dim i As Long, LRow As Long
Dim wb As Workbook, Import As Worksheet, Dashboard As Worksheet
Dim myArr As Variant

Set wb = ThisWorkbook
Set Import = wb.Sheets("Import")
Set Dashboard = wb.Sheets("Dashboard")

myArr = Import.Range(Dashboard.Range("B18").Value)
LRow = Dashboard.Cells(Dashboard.Rows.Count, "F").End(xlUp).Row
If LRow < 6 Then LRow = 6

For i = 1 To UBound(myArr) - 1
    If myArr(i, 2) = Dashboard.Range("B9").Value Then 
        DashBoard.Cells(LRow, "F").Value = myArr(i, 1)
        LRow = LRow + 1
    End If
Next i

End Sub

编辑
如何用范围填充数组

数组基本上是存储在 PC 内存中的表。用范围内的值填充这样的数组很有用,因为使用数组通常比使用范围对象快得多。

使用范围填充数组如下:

Dim myArr as Variant
myArr = ThisWorkbook.Sheets(1).Range("A1:B10")

数组通常以 0 为底,表示第一个索引号为 0。但是,对于范围内的数组,第一个索引号为 1,使其成为以 1 为底的数组。

因此,如果单元格B4 保存值Test,则myArr(2,4) 也保存该值。

但是:

Dim myArr as Variant
myArr = ThisWorkbook.Sheets(1).Range("A2:B10")

对于上面的数组,对单元格 B4 的值的引用是 myArr(2,3),因为数组是从第二行开始填充的。

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 2018-10-24
    • 2021-05-02
    • 2023-02-23
    相关资源
    最近更新 更多