Ваши 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:
x=1
, поскольку это начало первого цикла. - Теперь мы перебираем каждую ячейку в
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 раз снова и снова. Теперь он сохранит значение, установленное в этой последней итерации этого единственного цикла, в котором мы находимся.
- После всего этого цикла мы собираемся сделать тот же цикл через столбец
C
.
3a. Теперь мы находимся внутри этого цикла в столбце C
и устанавливаем initial_2
для первого символа в ячейке C2
.
...
3LAST. Наконец мы достигли C1001
и сохранили первую букву ячейки C1001
в Initial_2
. Обратите внимание, что initial_2
еще не использовался, просто устанавливайте 1000 раз снова и снова. Теперь он сохранит значение, установленное на последней итерации этого цикла, в котором мы находимся.
- Теперь сделайте тот же цикл через столбец E (вы поймете):
4a. Теперь мы пишем initial_1 & initial_2 & Number
в B1
4b. Теперь мы пишем initial_1 & initial_2 & Number
в B1
(обратите внимание, что значения в этих переменных не изменились, потому что мы уже сделали этициклы, прежде чем мы нажмем 4
)
...
4LAST. Теперь мы записываем initial_1 & initial_2 & Number
в B1
- СЕЙЧАС мы повторяем в
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