Попытка извлечь инициалы имени и фамилии, а также числа, чтобы сформировать идентификационный номер - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь выполнить это в Excel VBA, и он продолжает использовать фамилию и имя в столбце для всех идентификаторов пользователей. Также пытаюсь записать идентификаторы пользователей в столбце F.

Sub User()

Columns("F").Insert Shift:=x1ToLeft 'Inserts a column in between F and E
[F1].Value = "User ID"

Dim Number As String
Dim initial_1 As String
Dim initial_2 As String
Dim cell As Range
Dim txt As String

Dim x As Integer
NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count

Range("A2").Select

For x = 1 To NumRows

For Each cell In Range("B2:B1001")
txt = cell.Value
initial_1 = Left(txt, 1)
Next cell

For Each cell In Range("C2:C1001")
txt = cell.Value
initial_2 = Left(txt, 1)
Next cell

For Each cell In Range("E2:E1001")
txt = cell.Value
Number = Left(txt, 4)
cell.Range("B1") = initial_1 & initial_2 & Number
Next cell

Next

End Sub

1 Ответ

2 голосов
/ 31 октября 2019

Ваши for петли не верны. Ваш код:

For x = 1 To NumRows

For Each cell In Range("B2:B1001")
txt = cell.Value
initial_1 = Left(txt, 1)
Next cell

For Each cell In Range("C2:C1001")
txt = cell.Value
initial_2 = Left(txt, 1)
Next cell

For Each cell In Range("E2:E1001")
txt = cell.Value
Number = Left(txt, 4)
cell.Range("B1") = initial_1 & initial_2 & Number
Next cell

Next

Давайте продумать итерацию.

Итерация 1:

  1. x=1, поскольку это начало первого цикла.
  2. Теперь мы перебираем каждую ячейку в B2:B1001
    2a. Теперь мы находимся внутри этого цикла в столбце B, и мы устанавливаем initial_1 для первого символа вячейка B2.
    2b. Мы просто перешли к следующей ячейке в этом диапазоне, поэтому B3. Мы устанавливаем initial_1 на первую букву в B3.
    2c. Мы просто перебрали следующую ячейку в этом диапазоне, поэтому B4. Мы устанавливаем initial_1 на первую букву в B4.
    ...
    2LAST. Мы наконец добрались до ячейки B1001 и установили initial_1 на первую букву в B1001. Обратите внимание, что initial_1 еще не использовался, просто устанавливайте 1000 раз снова и снова. Теперь он сохранит значение, установленное в этой последней итерации этого единственного цикла, в котором мы находимся.
  3. После всего этого цикла мы собираемся сделать тот же цикл через столбец C.
    3a. Теперь мы находимся внутри этого цикла в столбце C и устанавливаем initial_2 для первого символа в ячейке C2.
    ...
    3LAST. Наконец мы достигли C1001 и сохранили первую букву ячейки C1001 в Initial_2. Обратите внимание, что initial_2 еще не использовался, просто устанавливайте 1000 раз снова и снова. Теперь он сохранит значение, установленное на последней итерации этого цикла, в котором мы находимся.
  4. Теперь сделайте тот же цикл через столбец E (вы поймете):
    4a. Теперь мы пишем initial_1 & initial_2 & Number в B1
    4b. Теперь мы пишем initial_1 & initial_2 & Number в B1 (обратите внимание, что значения в этих переменных не изменились, потому что мы уже сделали этициклы, прежде чем мы нажмем 4)
    ...
    4LAST. Теперь мы записываем initial_1 & initial_2 & Number в B1
  5. СЕЙЧАС мы повторяем в X=2 и делать ВСЕ это снова ... это те же самые шаги, которые мы только что предприняли, что означает, что мы делаем много работы даром.

Вместо этого выполните цикл один раз и выполните всю эту логику в цикле 1.

Sub User()

Columns("F").Insert Shift:=x1ToLeft 'Inserts a column in between F and E
[F1].Value = "User ID"

Dim Number As String
Dim initial_1 As String
Dim initial_2 As String    
Dim txt As String

Dim x As Integer
NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count



For x = 2 To NumRows
    initial_1 = Left(Range("B" & x).value, 1)
    initial_2 = Left(Range("C" & x).value, 1)
    Number = Left(Range("E" & x).value, 4)
    txt = Range("E" & x).value 

    'Now write this somewhere (surely not B1 over and over again) I'm guessing column F
    Range("F" & x).value = initial_1 & initial_2 & Number
Next


End Sub

Здесь та же самая логика, но без необходимости разбрасывать так много переменных вокруг:

Sub User()    
    Columns("F").Insert Shift:=x1ToLeft 'Inserts a column in between F and E
    [F1].Value = "User ID"      

    Dim x As Integer
    NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count

    For x = 2 To NumRows
        Range("F" & x).value =  Left(Range("B" & x).value, 1) & Left(Range("C" & x).value, 1) & Left(Range("E" & x).value, 4)           
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...