我有包含全名的單元格值。僅當名稱以它們開頭時才刪除特定的字符串
我想從整個Excel工作表中替換/刪除以下字符:
Al
Al-
EL
El-
但事實是,我想他們如果字與字開始只能更換。例如:
Alorfze - (刪除 「AL」) arALfzi - (不刪除 「AL」) 易卜拉欣埃爾 - ketoob(刪除 「EL-」)
此外,將如果匹配的單詞超過4個字符,則僅替換此字符。
我有包含全名的單元格值。僅當名稱以它們開頭時才刪除特定的字符串
我想從整個Excel工作表中替換/刪除以下字符:
Al
Al-
EL
El-
但事實是,我想他們如果字與字開始只能更換。例如:
Alorfze - (刪除 「AL」) arALfzi - (不刪除 「AL」) 易卜拉欣埃爾 - ketoob(刪除 「EL-」)
此外,將如果匹配的單詞超過4個字符,則僅替換此字符。
要刪除以字符「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個單詞作爲示例及其派生的公式輸出。
非常感謝你安德烈 – user2698113
如何:
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
它不會爲我工作,它不會改變任何東西:( ibrahim el-ketoob(例如沒有改變),我遵循微妙的運行的步驟。希望得到你的幫助 – user2698113
在工作簿中的所有細胞替換文本意味着使用VBA代碼。將以下代碼放入模塊中(使用Alt-F11打開VBA編輯器,然後選擇插入 - >模塊添加模塊,然後複製/粘貼以下文本;返回工作表,選擇「宏」,運行replaceStuff
並觀看魔術有幾件事情需要注意:
Option Explicit
:總是一個好主意,對錯別字等Option Compare Text
後衛:意思是「人」 =「AL」 - 換句話說,從比較中刪除大小寫敏感(通常是您想要的)Application.ScreenUpdating = False
,並在年底將其設置True
,你加快執行和保存電子表格的一些閃爍執行期間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
被替換。
我希望你可以從這裏找出如何改變的東西,以適應ÿ我們的需求。
它不會對我工作,它不會改變任何東西:( ibrahim el-ketoob(例如沒有改變),我按照微步準確運行。希望得到你的幫助 – user2698113
我看到問題 - 正如所寫,這隻會檢查單元格中文本的開始,而不是每個單詞的開始。將於今天晚些時候更新。 – Floris
感謝您的回覆,我將等待您:D – user2698113
發佈您嘗試過的或您已獲得多少。所以這不是真正的開放式問題。 – Taylor
告訴我們你到目前爲止做了什麼。另外,請不要在問題標題中加入標籤。標題必須簡要解釋您的問題或擔憂,我建議您提出下一個問題,以便爲您的問題提供更好的標題。 –
似乎是一個合理的問題;肯定含糊不清,並且沒有任何企圖自己編寫代碼的嘗試,但除了形式之外,我看不出問題所在? – whytheq