2015-09-26 305 views
1

我正試圖在Excel中使用Visual Basic創建一個函數,該函數將遍歷一個值表以在字符串中進行搜索並進行替換。例如,給定表,在Excel中創建批量替換函數

[A] [B]   
[1] foo REPLACE1 
[2] bar REPLACE2 

我想方程式=BULKREPLACE("I foo my bar.", Lists!A:A)渲染I REPLACE1 my REPLACE2.

我開始寫下面的代碼片段,但意識到我不知道如何得到這個Visual Basic代碼的工作,所以決定在這裏發帖尋求幫助。

Function BULKREPLACE(Vcell As String, Vsearch As Range) As String 

Dim Vwksht As String 
Dim Vlastrow As Integer 
Dim Vx1 As String 
Dim Vrow As Integer 

Vwksht = Vsearch.Worksheet.Name 
Vlastrow = Vsearch.Cells.Find("*", , , , xlByRows, xlPrevious).Row 
Vx1 = Vcell 

For Vrow = 2 To Vlastrow 

    If Not IsEmpty(Worksheets(Vwksht).Range(Vsearch.Column & Vrow)) Then 

    Vx1 = replace(Vx1, Worksheets(Vwksht).Range(Vsearch.Column & Vrow).Value, Worksheets(Vwksht).Range(Chr(Asc(Vsearch.Column) + 1) & Vrow).Value) 

    End If 

Next 

BULKREPLACE = Vx1 

End Function 

我想代碼也遍歷每個可能的值。我只是沒有在那裏得到循環語句。 此外,查找值表將存儲在與使用BULKREPLACE函數的工作表不同的工作表中,因此重要的是讓代碼在定義的工作表上運行查找。


設計澄清

  1. 的功能應該是動態的:能夠被多次使用,每次用不同的搜索和替換的定義。
  2. 搜索和替換定義存儲在一個單獨的工作表中,總是位於彼此相鄰的兩列中,並且是用戶可更新的。定義工作表還將包含其他數據。
  3. 該功能僅用於全字替換。
+0

是字典表動態 - 它是指不同的列表,或在不隨時間變化表中的數據?否則,使用字典將數據加載到內存中並從中獲取數據會更好。 –

+0

你有多個單詞替換 - '我的'應該被'酒吧MY'替換?如果不是,請考慮使用拆分功能將字符串拆分爲單詞。 –

+0

作爲函數的第二個參數傳遞字符串表名或確切範圍,例如替換表第一行'Lists!A1:A20',但不是整行'Lists!A:A'?表單上只有一個替換表,還是包含其他數據?你打算只取代整個單詞嗎?'替換爲'I REPLACE1my REPLACE2.')? – omegastripes

回答

0

試試這個:

Option Explicit 

Public Function BULKREPLACE(ByVal Vcell As String, ByRef Vsearch As Range) As String 
    Dim v As Variant, i As Long, lr As Long 

    If Len(Vcell) > 0 And Not Vsearch Is Nothing Then 

     If Vsearch.Columns.Count = 1 Then 

      lr = Vsearch.Cells(Vsearch.Row).End(xlDown).Row 
      v = Vsearch.Resize(lr, Vsearch.Columns.Count + 1) 

      For i = 1 To lr 
       If Len(v(i, 1)) > 0 Then Vcell = Replace(Vcell, v(i, 1), v(i, 2)) 
      Next 
     End If 
    End If 

    BULKREPLACE = Vcell 
End Function 

BULKREPLACE

它將使用第一個連續範圍內A:B爲查找值\映射

0

您將需要一個過渡串變量在迭代可能的更改時保存更改的值。提供區分大小寫或不區分大小寫的替換(具有默認值)的選項也可能是值得的。

Function BULKREPLACE(sTMP As String, rTERMS As Range, Optional bCASE As Boolean = False) As String 
    Dim rWhat As Range 

    For Each rWhat In rTERMS.Columns(1).Cells 
     sTMP = Replace(sTMP, rWhat.Value2, rWhat.Offset(0, 1).Value2, 1, -1, _ 
         IIf(bCASE, vbBinaryCompare, vbTextCompare)) 
    Next rWhat 

    BULKREPLACE = sTMP 
End Function 

像使用任何本地工作表函數一樣使用。在下面這個例子中的形象將是,

=BULKREPLACE(D4, $A$2:$B$3) 

Bulk Text Replacement UDF function

+0

@Brandon Lebedev - 增加了直接從字符串的能力;仍然可以用於單元格引用。 – Jeeped

+0

我喜歡bCASE選項。你可以限制功能全字匹配?現在它正在用「lREPLACE2k」取代「lbark」。此外,它需要很長時間。可以用'Vsearch.Cells.Find(「*」,,,,xlByRows,xlPrevious).Row'減少處理時間來限制rWhat? –