VBA Range.Replace方法不起作用

这是我的代码:

Dim ValDate As String Dim FName As String Dim rows As Integer Dim col As Integer ValDate = InputBox("Enter cell range:") If ValDate = "" Then Exit Sub End If r = 1 c = 20 rows = Range(ValDate).Row col = Range(ValDate).Column FName = InputBox("Enter name:") Range("B2:G22").Select Selection.Copy Range(ValDate).Select Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False ActiveSheet.Paste Range(ValDate).Offset(0, 1) = FName With Range(Cells(rows, col), Cells(rows + c, col)).Offset(1, 0) .Replace "ABCDE", FName End With With Range(Cells(rows, col), Cells(rows + c, col)).Offset(1, 1) .Replace "ABCDE", FName End With With Range(Cells(rows, col), Cells(rows + c, col)).Offset(1, 3) .Replace "ABCDE", FName End With 

问题是当macros试图replace单词。 什么都没发生。 昨天我在做这个,一切都很好。 今天,我试图继续这个macros的工作,并运行testing。 没有。 有人能解释为什么吗? 我没有改变任何东西。 我运行macros时没有错误。 只是阅读代码,并跳过它。

我希望这会有所帮助,即使你想以不同于预期的方式来做事。 代码用您input的FNamereplace“ABCDE”文本(即使“ABCDE”只是单元格内容的一部分)。 所有更改都应用于原始数据

您必须先通过编辑来指定图纸的名称:sheetname =“ Sheet1

然后通过编辑指定数据范围:v_data = .Range(“ b2:g ”&thelastrow)

最后一行将自动设置为包含任何数据的表单中的最后一行。

如果你想修改代码的行为,请告诉我。

 Dim FName As String, sheetname As String Dim thelastrow As Integer, dataRow As Integer, dataCol As Integer Dim v_data As Variant Application.ScreenUpdating = False sheetname = "Sheet1" With ThisWorkbook.Worksheets(sheetname) thelastrow = .Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row v_data = .Range("b2:g" & thelastrow) FName = InputBox("Enter name:") For dataRow = LBound(v_data) To UBound(v_data) For dataCol = LBound(v_data, 2) To UBound(v_data, 2) If InStr(1, v_data(dataRow, dataCol), "ABCDE") <> 0 Then v_data(dataRow, dataCol) = Replace(v_data(dataRow, dataCol), "ABCDE", FName) End If Next dataCol Next dataRow .Range("b2:g" & thelastrow) = v_data End With Application.ScreenUpdating = True 

我可以给你一条鱼,但我会交给你一个钓鱼杆。

当您碰巧遇到类似问题时,导航到您的开发人员选项卡并selectVisual Basic。 find包含您的代码的对象,右键单击它,查看代码(或者如果代码直接在您的工作表中,那么只需右键单击+在工作表选项卡上查看代码)。

记住总是在macros的顶部添加Option Explicit(在声明variables之前),以便于debugging。

通过在代码中反复按F8,可以逐行执行macros,除非屏幕更新为false,否则可以在工作表上预览macros的当前结果。 你也会知道这个macros在什么时候不会像你想的那样行事,并且可以把它缩小到导致问题的部分代码。

在您的代码中,指定您所使用的工作簿/工作表:

 this_workbook = "myWorkBook.xlsm" mySheet = "theSheet" ' then specify the range like this yourRange = "[" & this_workbook & "]" & mySheet & "!B2:G22" 

您也可以使用此代码指定您想要使用的范围:

 dim ws as worksheet set ws = ThisWorkBook.sheets(1) 'set the first tab of this work book 

那么当你想与你交互时,你使用的是一个单元格:

 ws.Range("B2:G22").select 

另外,如果你想粘贴一个值到一个单元格,那么你不需要“select”它,除非你想显示用户。 你的代码:

 Range("B2:G22").Select Selection.Copy Range(ValDate).Select Selection.PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False 

可以更改为:

 Range("B2:G22").Copy Range(ValDate).PasteSpecial Paste:=xlPasteColumnWidths, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False 

尝试使用Replace()函数而不是.Replace

例如

 Dim Rng as Range Set Rng = Range(Cells(rows, col), Cells(rows + c, col)).Offset(1, 0) Rng.Value = Replace(Rng.Value, "ABCDE", FName)