【发布时间】:2018-10-18 18:54:48
【问题描述】:
我一直遇到 VBA Excel 中的一些代码问题,正在寻求帮助!
我正在尝试对具有相应电话号码的姓名列表进行排序,检查同一电话号码下的多个姓名。然后将这些名称发布到单独的表格中。
到目前为止,我的代码是:
Sub main()
Dim cName As New Collection
For Each celli In Columns(3).Cells
Sheets(2).Activate
On Error GoTo raa
If Not celli.Value = Empty Then
cName.Add Item:=celli.Row, Key:="" & celli.Value
End If
Next celli
On Error Resume Next
raa:
Sheets(3).Activate
Range("a1").Offset(celli.Row - 1, 0).Value = Range("a1").Offset(cName(celli.Value) - 1, 0).Value
Resume Next
End Sub
当我尝试运行代码时,它会使 Excel 崩溃,并且没有给出任何错误代码。
我尝试解决的一些问题:
项目短清单
使用 cstr() 将电话号码转换为字符串
调整范围和偏移
我对这一切都很陌生,在本网站上其他帖子的帮助下,我才设法在代码上做到了这一点。不知道该去哪里,因为它只是崩溃并且没有给我任何错误可以查看。感谢您的任何想法谢谢!
更新:
Option Explicit
Dim output As Worksheet
Dim data As Worksheet
Dim hold As Object
Dim celli
Dim nextRow
Sub main()
Set output = Worksheets("phoneFlags")
Set data = Worksheets("filteredData")
Set hold = CreateObject("Scripting.Dictionary")
For Each celli In data.Columns(3).Cells
On Error GoTo raa
If Not IsEmpty(celli.Value) Then
hold.Add Item:=celli.Row, Key:="" & celli.Value
End If
Next celli
On Error Resume Next
raa:
nextRow = output.Range("A" & Rows.Count).End(xlUp).Row + 1
output.Range("A" & nextRow).Value = data.Range("A1").Offset(hold(celli.Value) - 1, 0).Value
'data.Range("B1").Offset(celli.Row - 1, 0).Value = Range("B1").Offset(hold
Resume Next
End Sub
更新2:
使用hold.Exists 和ElseIf 删除GoTo。还将其更改为将行复制并粘贴到下一张表。
Sub main()
Set output = Worksheets("phoneFlags")
Set data = Worksheets("filteredData")
Set hold = CreateObject("Scripting.Dictionary")
For Each celli In data.Columns(2).Cells
If Not hold.Exists(CStr(celli.Value)) Then
If Not IsEmpty(celli.Value) Then
hold.Add Item:=celli.Row, Key:="" & celli.Value
Else
End If
ElseIf hold.Exists(CStr(celli.Value)) Then
data.Rows(celli.Row).Copy (Sheets("phoneFlags").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0))
'output.Range("A" & nextRow).Value = data.Range("A1").Offset(hold(celli.Value) - 1, 0).Value
End If
Next celli
End Sub
【问题讨论】:
-
你还没有初始化
celli但你也应该避免activate和Goto的 -
为什么不使用 If .Exists 然后将其存储在另一个 dict 中,然后将该 dict 的键|值一次性写入工作表?
-
使用
Option Explicit并修复它暴露的声明错误。 -
@Brotato 我在
Dim celli中添加,不管我声明它最终还是崩溃。我正在寻找其他方法让它在没有activate和GoTo的情况下工作。我注意到帖子提到这是一个坏习惯,只是不确定如何编码。 -
@QHarr 我对“If .Exists”不熟悉,我会研究这个选项!听起来它会比我放在一起的代码更少。