VBA Range.Replace方法不起作用

时间:2016-03-23 09:34:16

标签: excel vba

这是我的代码:

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

问题是当宏试图替换单词时。什么都没发生。昨天我正在努力,一切都很好。今天我试着继续研究这个宏并运行测试。没有。有人可以解释原因吗?我没有改变任何事情。 运行宏时没有错误。只需阅读代码并跳过它。

5 个答案:

答案 0 :(得分:2)

我可以给你一条鱼,但我会给你一根钓鱼竿。

当您遇到任何类似问题时,请导航到“开发人员”选项卡并选择“Visual Basic”。找到包含代码的对象,右键单击它,查看代码(或者代码直接在工作表中,然后右键单击+查看工作表选项卡上的代码)。

请记住,在宏的顶部(在声明变量之前)总是添加Option Explicit以便于调试。

通过在代码中反复按F8,您可以逐行执行宏,除非屏幕更新为false,否则您可以在工作表上预览宏的当前结果。您还将知道宏在什么时候不会像您希望的那样运行,并且可以将其缩小到导致问题的部分代码。

答案 1 :(得分:1)

尝试使用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)

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您还可以使用以下代码指定要使用的范围:

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

然后当您想要与您交互时使用的单元格:

ws.Range("B2:G22").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

答案 4 :(得分:0)

我希望这会有所帮助,即使你想用与我预期不同的方式做事。代码用您的输入FName替换“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