2013-08-19 36 views
0

我有包含全名的單元格值。僅當名稱以它們開頭時才刪除特定的字符串

我想從整個Excel工作表中替換/刪除以下字符:

Al 
Al- 
EL 
El- 

但事實是,我想他們如果字與字開始只能更換。例如:

Alorfze - (刪除 「AL」) arALfzi - (不刪除 「AL」) 易卜拉欣埃爾 - ketoob(刪除 「EL-」)

此外,將如果匹配的單詞超過4個字符,則僅替換此字符。

+0

發佈您嘗試過的或您已獲得多少。所以這不是真正的開放式問題。 – Taylor

+0

告訴我們你到目前爲止做了什麼。另外,請不要在問題標題中加入標籤。標題必須簡要解釋您的問題或擔憂,我建議您提出下一個問題,以便爲您的問題提供更好的標題。 –

+2

似乎是一個合理的問題;肯定含糊不清,並且沒有任何企圖自己編寫代碼的嘗試,但除了形式之外,我看不出問題所在? – whytheq

回答

1

要刪除以字符「al」,「el」,「al-」或「el-」開頭的前兩個字母,且這些字必須大於4個字符。

我會假設你有一列A列下的名稱,許多行作爲觀察值(A1,A2,A3等)。

這個例子適用於單元格A2。然後,您需要做的就是將公式拖到其他單元格中:

將名稱轉換爲小寫。輸入B2:

=LOWER(A2)&" " 

如果它有多個單詞,請獲取名(單詞)。 C2:

=TRIM(LEFT(B2,FIND(" ",B2))) 

第一個單詞中的字符數。 D2:

=LEN(C2) 

第一個字的前兩個字母。 E2:

=IF(D2>4,(LEFT(C2,2)),"") 

輸出1。F2:

=SUBSTITUTE(IF(E2="al",SUBSTITUTE(C2,"al","",1),IF(E2="el",SUBSTITUTE(C2,"el","",1),C2)),"-","") 

檢索的第二個字/名稱。 G2:

=TRIM(MID(B2,FIND(" ",B2),100)) 

第二個字中的字符數。 H2:

=LEN(G2) 

第二個字的前兩個字母。 I2:

=IF(H2>4,(LEFT(G2,2)),"") 

輸出2. J2:

=SUBSTITUTE(IF(I2="al",SUBSTITUTE(G2,"al","",1),IF(I2="el",SUBSTITUTE(G2,"el","",1),G2)),"-","") 

成品(完整名單,修剪後)。 K2

=IF(J2="",PROPER(F2),PROPER(F2&" "&J2)) 

以下是8個單詞作爲示例及其派生的公式輸出。

enter image description here

+1

非常感謝你安德烈 – user2698113

0

如何:

Sub dural() 
    s = "Al-" 
    t = "Al" 
    u = "EL" 
    For Each r In ActiveSheet.UsedRange 
     If Len(r.Text) > 4 Then 
      If Left(r.Text, 3) = s Then 
       r.Value = Mid(r.Text, 4, 9999) 
       GoTo skipit 
      End If 
      If Left(r.Text, 2) = t Or Left(r.Text, 2) = u Then 
       r.Value = Mid(r.Text, 3, 9999) 
      End If 
     End If 
skipit: 
    Next 
End Sub 
+0

它不會爲我工作,它不會改變任何東西:( ibrahim el-ketoob(例如沒有改變),我遵循微妙的運行的步驟。希望得到你的幫助 – user2698113

3

在工作簿中的所有細胞替換文本意味着使用VBA代碼。將以下代碼放入模塊中(使用Alt-F11打開VBA編輯器,然後選擇插入 - >模塊添加模塊,然後複製/粘貼以下文本;返回工作表,選擇「宏」,運行replaceStuff並觀看魔術有幾件事情需要注意:

  1. 使用的Option Explicit:總是一個好主意,對錯別字等
  2. Option Compare Text後衛:意思是「人」 =「AL」 - 換句話說,從比較中刪除大小寫敏感(通常是您想要的)
  3. 要檢查的字符串數組是一個變量:可以很容易地更改要編輯的內容
  4. 通過在宏的開始設置Application.ScreenUpdating = False,並在年底將其設置True,你加快執行和保存電子表格的一些閃爍執行期間
  5. 只有兩個參數使用Mid()功能的裝置「,直到的結束字符串」 - 短,更強勁,比任何使用‘大數字’或類似的東西len(c.Text) - l

編輯修改,即使它們出現在單詞的開頭來代替搜索字符串,但不啓動的細胞

Option Explicit 
Option Compare Text 

Sub replaceStuff() 
Dim getRidOf 
getRidOf = Array("AL-", "AL", "EL-", "EL") 
Dim c As Range 
Dim s, sp 
Dim f As Integer 
Dim flag As Boolean 

Application.ScreenUpdating = False 
For Each c In ActiveSheet.UsedRange.Cells 
    c.Select 
    If Len(c.Text) >= 4 Then 
    For Each s In getRidOf 
     flag = False 
     f = InStr(1, c.Text, s) 
     If f > 0 Then 
     ' check that it's part of a four letter word or more 
     sp = InStr(f, c.Text, " ") 
     If sp > f + 3 Or (sp = 0 And f <= Len(c.Text) - 3) Then 
      If f = 1 Then 
      flag = True 
      Else 
      If Mid(c.Text, f - 1, 1) = " " Then ' it is at the start of a word 
       flag = True 
      End If ' at start of word 
      End If ' f = 1 
     End If ' four letter word 
     End If ' f > 0 
     If flag Then 
     c.Value = Replace(c.Value, s, "") 
     Exit For 
     End If 
    Next s 
    End If 
Next c 

Application.ScreenUpdating = True 

End Sub 

測試:

ibrahim el-ketoob ibrahim ketoob 
ibrahimel-ketoob ibrahimel-ketoob 
abel  abel 
aleb  eb 
al bob  al bob 
belbo  belbo 
bol al bel  bol al bel 
el al  el al 
allele  lele 
alele  ele 
elalle  alle 
alelle  elle 

注 - 我添加字符串「EL-」作爲另一個搜索字符串所以el-ketoob會變成ketoob,而不是-ketoob

還要注意 - 事情按「順序」進行處理。現在有一個Exit For聲明後第一個字符串被替換(這意味着:「不要與getRidOf陣列中的其他字符串比較這個特定的單元格;我們完成了,去下一個單元格」),所以只有第一個匹配被替換(只有一個匹配 - 因此alfred al-hamsy將變成alfred hamsy,因爲al-al之前得到處理,然後停止。如果刪除Exit For(在其前面添加一個撇號'以將其變成註釋),它會成爲fred hamsy,但alfred alhamsy會變成fred alhamsy因爲只有第一al被替換。

我希望你可以從這裏找出如何改變的東西,以適應ÿ我們的需求。

+0

它不會對我工作,它不會改變任何東西:( ibrahim el-ketoob(例如沒有改變),我按照微步準確運行。希望得到你的幫助 – user2698113

+0

我看到問題 - 正如所寫,這隻會檢查單元格中文本的開始,而不是每個單詞的開始。將於今天晚些時候更新。 – Floris

+0

感謝您的回覆,我將等待您:D – user2698113

相關問題