【问题标题】:excel vba selecting cellsexcel vba选择单元格
【发布时间】:2011-12-06 09:42:43
【问题描述】:

我必须根据其他组合框中的选定值填充几个组合框。我想要的是用所选名称的活动填充框。我比较某个名称是否在一行中,然后使用偏移量获取活动名称并将其写入数组。它不起作用可能与偏移有关,或者活动单元格的合并可能是一个问题。这是我的代码:

Function FindingActivities(ExpName)

Dim ActNames(500) As String
Dim i As Integer
Dim CurrContent As String


For Each cell In Range("B7").EntireColumn.cells
    If cell.Value <> "" Then
        If ExpName = cell.Value Then
            CurrContent = Left(cell.Offset(0, -1).Value, 2)
            If CurrContent = "Ac" Then
                ActNames(i) = cell.Offset(0,-1).Value
                i = i + 1
            End If
        End If
    End If
Next cell

FindingActivities = ActNames()

End Function

这是填充组合框的代码:

Private Sub ComboBox1_Change()

Dim ExpName As String
ExpName = ComboBox1.Value
Dim ActNames() As String

ActNames = FindingActivities(ExpName)

For i = 0 To UBound(ActNames)
    If ActNames(i) <> "" Then
        ComboBox3.AddItem ActNames(i)
    End If
Next

End Sub

有人有想法吗?

【问题讨论】:

  • 哪个部分不工作?你是如何声明你的变量的?
  • 我为函数添加了附加代码。不工作的部分是 CurrContent 是空的,尽管活动名称应该在那里。
  • CurrContent 总是 是一个空字符串吗?您是否尝试过设置断点并调试代码?例如关注cell.Offset(0, -1).Value?听起来您只需要这样做,您就会自己发现错误。
  • 是的 CurrContent 总是空的,但我不知道为什么。 - 一段时间后 - 我取消合并单元格并将活动名称放在具有名称的单元格旁边并找到它。合并的单元格是问题所在。
  • 有很多潜在的问题。例如,如果你在一个单元格中调用它,你试图将一个 500 个字符串数组转储到一个单元格中,这将不起作用。充其量,它只会给你第一个元素。

标签: excel vba offset


【解决方案1】:

更新:为了清晰而重写

有点不清楚你在哪里卡住了,但我提供了一个应该可以正常工作的重写:

  1. 使用字典存储 ActNames 并使用 .items 将它们作为数组获取
  2. 动态查找 B 列的边界,而不是查找整个列
  3. 使用变体数组存储 A 列和 B 列并循环遍历(快得多)

代码如下:

Private Sub ComboBox1_Change()

Dim ExpName As String
ExpName = ComboBox1.Value
Dim ActNames As Variant

ActNames = FindingActivities(ExpName)
'Add this so you aren't just adding results upon results
ComboBox3.Clear

For i = LBound(ActNames) To UBound(ActNames)
    ComboBox3.AddItem ActNames(i)
Next

End Sub

...

Function FindingActivities(ByVal ExpName As String)

Dim dict As Object
Set dict = CreateObject("scripting.dictionary")
Dim i As Long
Dim cell As Range
Dim varray As Variant

varray = Range("A1:B" & Range("B" & Rows.Count).End(xlUp).Row).Value

For i = 1 To UBound(varray, 1)
    If Len(varray(i, 2)) <> 0 Then
        If varray(i, 2) = ExpName Then
            If Left$(varray(i, 1), 2) = "Ac" Then
                dict.Add i, varray(i, 1)
            End If
        End If
    End If
Next

FindingActivities = dict.items

End Function

基本上在不固定长度的列上使用固定长度的字符串数组是自找麻烦。这对内存不好,速度慢,并且可能导致错误。字典就像集合一样,除了你可以过滤到唯一的条目,如果你喜欢(在这种情况下我没有)并将键或项目作为数组输出。非常有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多