用于替换表中的值的宏
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用于替换表中的值的宏相关的知识,希望对你有一定的参考价值。
我有大量的数据(大约60列和60,000行)格式化为Excel中的表格。我希望使用宏来替换大于1的所有值,这些值位于表中标题为“Salary”的列中,值为“2”。该表是动态的,因此我需要引用替换为Tables列名而不是像D:D这样的列范围。
更新:我已经将以下代码放在一起,但是当我使用What:=“> 0”时无法使其工作,但是如果what =“5”则它将起作用。我究竟做错了什么?
Sub FindReplace3()
ActiveSheet.ListObjects("Table1").ListColumns(61).DataBodyRange.Replace _
What:=">0", replacement:="7", _
SearchOrder:=xlByColumns, MatchCase:=True
End Sub
答案
我看到这是你在Stackoverflow上的第一篇文章,所以,欢迎。
我也看到你被标记为你的问题,这可能是令人沮丧的第一次介绍该网站。
在SO上有一种期望,你将首先研究并尝试一些事情,然后将这些信息与问题一起发布。
你非常接近,但你的代码失败了,因为你正在搜索文字字符串“> 0”(What:=“> 0”)。 > 0显然不存在作为文字字符串。
内置替换功能将查找限制为文字字符串。因此我会使用这种方法:
Sub replaceTest()
Dim dblCnt As Double
dblCnt = 0
With ThisWorkbook.Worksheets("Sheet1")
For i = 1 To Range("Table1").Rows.Count
If Range("Table1[Salary]")(i) > 1 Then
Range("Table1[Salary]")(i) = "2"
dblCnt = dblCnt + 1
End If
Next i
End With
MsgBox "Finished replacing " & CStr(dblCnt) & " items", vbOKOnly, "Complete"
End Sub
仅供参考,您的代码示例引用了第61列,但您说该列称为“薪水”。您可以通过更改样本来引用列名称:
ActiveSheet.ListObjects("Table1").ListColumns(61).DataBodyRange.Replace _
至
ActiveSheet.ListObjects("Table1").ListColumns("Salary").DataBodyRange.Replace _
我在下面添加了另一个代码部分,并且必须转到@Slai他使用'Evaluate'函数的方法与我原来的答案相比是瞬时的:
Sub replaceTest001()
Dim StartTime As Date
StartTime = Now()
Dim dblCnt As Double
dblCnt = 0
Application.ScreenUpdating = False
With ThisWorkbook.Worksheets("Sheet1")
[Table1[Salary]] = [if(Table1[Salary] > 1, 2, Table1[Salary])]
End With
Application.ScreenUpdating = True
MsgBox "Finished updating " & CStr(dblCnt) & " items" & vbCrLf & _
"Time taken: " & Format((Now() - StartTime), "hh:mm:ss"), vbOKOnly, "Complete"
End Sub
另一答案
Evaluate可以用来立即替换所有:
[Table1[Salary]] = [if(Table1[Salary] > 1, 2, Table1[Salary])]
以上是关于用于替换表中的值的宏的主要内容,如果未能解决你的问题,请参考以下文章
sql - 当我得到 2 个或更多具有相同值的值时,仅更新 1 个(查询找到的第一个)值的方法?