2017-04-04 37 views
1

我有數據表明它不在單元格中的一致位置,有時它有分號,有時位於分號的右側或左側。我期待的最終結果是在B列中列出所有「學生」(由不是教師定義)和列C中的所有教師。如果找不到學生或教師,則相應的單元格應爲空白。VBA查找單元格中的字符串並將其複製到不同的單元格

目前我正在做一個文本列分隔兩列然後用下面的公式來有學生和老師分開:

=IF(SUMPRODUCT(--ISNUMBER(SEARCH({"Arts and Music","Math and Science"},A2)))>0,B2,C2) 

=IF(SUMPRODUCT(--ISNUMBER(SEARCH("Teacher",A2)))>0,B2,C2) 

我還要做手工查找和替換刪除括號和文本,只留下學生/教師的名字。

是否有任何VBA宏可以幫助我從列A獲得預期的結果在列B和C?謝謝。

enter image description here

+3

是的,你寫的。這不是一個代碼寫入服務。努力自己寫一個問題,並問你是否遇到問題。三個實際上是幾十個(如果不是數百個)關於循環遍歷VBA中的單元格的現有問題,您可以使用它來開始。 –

回答

1

您可以使用正則表達式來做到這一點。請參閱post以瞭解如何在Excel中啓用它們。

Sub FindStrAndCopy() 
Dim regEx As New RegExp 
regEx.Pattern = "\s*(\w+)\s*\((.+)\)" 

With Sheets(1): 
    Dim arr() As String 
    Dim val As String 

    Dim i As Integer, j As Integer 
    Dim person As String, teachOrSubject As String 
    Dim mat As Object 

    For i = 2 To .Cells(.Rows.Count, "A").End(xlUp).Row: 
    val = Cells(i, "A").Value 
    arr = Split(val, ";") 
    For j = 0 To UBound(arr): 
     Set mat = regEx.Execute(arr(j)) 
     If mat.Count = 1 Then 
     person = mat(0).SubMatches(0) 
     teachOrSubject = mat(0).SubMatches(1) 
     If teachOrSubject = "Teacher" Then 
      Cells(i, "C").Value = person 
     Else 
      Cells(i, "B").Value = person 
     End If 
     End If 
    Next 
    Next 

End With 
End Sub 

宏將字符串拆分爲分號,並將1或2個子字符串存儲在'arr'數組中。然後它會在每個表達式上進行正則表達式。如果括號內的字符串是「老師」,則先前的人名將存儲在「C」列中,否則它是學生,名稱存儲在列「B」中。

+0

我知道我不應該在評論中說謝謝,但這很好。我並不期待解決方案,但這完美地解決了我的問題。很高興看到仍有人願意爲別人提供幫助併爲此付出更多的努力。我總是盡力在我所能做到的地方做到這一點。再次感謝。 – chupeman

0

我創建了一個按鈕,上面寫着你對列的所有註冊一個 再換上B列 學生然後把老師對C列

檢查,我使用「(老師)」知道什麼時候老師在字符串中 我使用了名爲「Sheet1」的工作表 而我不使用第一行,因爲是標題行。

如果您有任何問題,請與我聯繫。

Private Sub CommandButton1_Click() 
'---------------------------------Variables----------------------------- 
Dim total, i, j As Integer 
'--------------Counting the number of the register in column A---------- 
ThisWorkbook.Sheets("Sheet1").Range("XDM1").Formula = "=COUNTA(A:A)" 
total = CInt(ThisWorkbook.Sheets("Sheet1").Range("XDM1").Value) 
'---------------------Creating arrays to read the rows------------------ 
Dim rows(0 To 1000) As String 
Dim columnsA() As String 
'------------Searching into the rows to find teacher or student--------- 
For i = 2 To total 
    columnsA = Split(ThisWorkbook.Sheets("Sheet1").Range("A" & i).Value, ";") 
    first = LBound(columnsA) 
    last = UBound(columnsA) 
    lenghtOfArray = last - first 
    MsgBox lenghOfArray 
    For j = 0 To lenghtOfArray 
     If InStr(columnsA(j), "(Teacher)") > 0 Then 
      MsgBox columnsA(j) 
      ThisWorkbook.Sheets("Sheet1").Range("C" & i).Value = columnsA(j) 
     Else 
      ThisWorkbook.Sheets("Sheet1").Range("B" & i).Value = columnsA(j) 
     End If 
    Next j 
Next i 
'--------------------------------Finishing------------------------------ 
End Sub 
相關問題