我正在尝试编写一个 Excel 宏,它将获取一列数据并针对格式错误进行编辑。背景:
- 电子表格通过三个名称列发送到公司 - LName、FName、MI
- 公司将其寄回,通常带有 FName 和 MI 组合或带有完整的中间名
- 如果单个名称出现错误,则状态会抛出合适并拒绝整个列表 - 例如 MI 是全名,FName 中有空格,MI 包含在 FName 中,MI 是零而不是字母等.
我不想每月手动检查近两千个名字。这是一种痛苦。所以我想我会编写一个执行以下操作的宏:
- 能够循环
- 如果 MI 在 FName 列中,则拉取 MI 并将其粘贴到下一列
- “修剪”或删除 FName 列中的空格和任何后续文本
最终我想添加一些其他的东西,但是一旦我弄清楚了,它们看起来很简单。
问题:
整个 sub 似乎从一个单元格运行,从不更改活动单元格,因此实际上并没有完成任何事情。IF 语句似乎认为每个 FName 列中都有一个空格,这是不正确的。我很肯定这是另一个“额外的眼睛”的东西,但我感觉非常愚蠢,我知道我的大脑有点被术后止痛药弄糊涂了。我什至不应该在工作(呃,现在闭嘴)。
即使我尝试选择并激活它应该在的单元格,它仍然保留在我通过所有迭代手动选择的任何单元格中,永远不会改变,只是将文本的最后一个字母放入下一个单元格中是否有空格. 所以项目符号格式的问题是:
- 未选择/激活正确的单元格。
- if 语句即使不应该返回正值。
- 因此,如果声明打破了整个愚蠢的事情。
无论如何。这是代码,虽然出于 HIPAA 的原因我无法共享电子表格,但可以做出以下安全假设:
F 列有姓氏,G 列应该有名字但通常包括名字、空格和中间名首字母(例如 BOB C 而不是 BOB),最后 H 列应该只有中间名首字母但通常有完整的中间名或零如果此人没有中间名(例如 CHARLES 而不是 C 或只有 0)。稍后我将在此函数或其他函数中将零更改为“”并将完整的中间名修剪为首字母。
Sub ReduceToInitial()
Dim strInit As String
Dim strName As String
Dim r As Excel.Range
Dim rCell As Excel.Range
Dim lr As Long
Dim oSht As Worksheet
Set oSht = Application.ActiveSheet
lr = Cells(Rows.Count, "G").End(xlUp).Row
Set r = oSht.Range("G2:G" & lr)
Range("G2").Select
Range("G2").Activate
On Error Resume Next
For Each rCell In r
Range(rCell).Select
Range(rCell).Activate
If rCell.Find(" ", rCell) <> 0 Then
strInit = Right(rCell, 1)
ActiveCell.Offset(0, 1).Select
ActiveCell.Formula = strInit
ActiveCell.Offset(0, -1).Select
strName = rCell.Left(rCell, rCell.Find(" ", rCell) - 1)
ActiveCell.Formula = strName
End If
Next rCell
End Sub
如果我没有很好地解释自己,请告诉我,我会努力做得更好。