#excel #vba #split
#превосходить #vba #расщеплять
Вопрос:
Я пытаюсь использовать функцию split() для перебора указанного диапазона и разделения всех строк при обнаружении «:» и заменить существующее значение значением разделения.
Dim k As Integer Dim lRow as Long Dim startZip_col As Long Dim startZip_str As String Dim startZip_result() As String Dim startZip_decomposed As Variant For k = 2 To lRow startZip_str = Cells(k, startZip_col).Value startZip_result = Split(startZip_str, ":") For Each startZip_decomposed In startZip_result Cells(k, startZip_col) = startZip_result(1) Next Next k
примером значений, которые я хочу разделить, являются:
abc:1234 abc:5678 def:3456
попробовал отладку.печать, чтобы точно определить, где находятся ошибки, но значение столбца определено правильно, цикл выглядит нормально, не уверен, где что-то пошло не так
Комментарии:
1. Интересный. Я попробовал ваш код с
startZip_col = 1
lRow = 3'
и без каких-либо других изменений, он дал мне ответ,1234
что касается вводаabc:1234
. Теперь мне любопытно, что у вас пошло не так. Расскажи больше.
Ответ №1:
Логические:
- Где
lRow
.startZip_col
инициализирован? Правильно определите и инициализируйте свои переменные/объекты. - Полностью квалифицируйте ячейки, иначе они могут относиться к активному листу, который может быть не тем листом, о котором вы думаете. Например
ws.Cells(k, startZip_col).Value
, гдеws
находится соответствующий рабочий лист. - Перед разделением проверьте наличие
:
Код:
Option Explicit Sub Sample() Dim ws As Worksheet Dim lRow As Long Dim i As Long, j As Long Dim ZipCol As Long Dim ZipString As String Dim ZipResult As Variant '~~gt; Change this to the relevant sheet Set ws = Sheet1 '~~gt; Change this to the releavant column ZipCol = 1 With ws '~~gt; Get the last row in Col A. Change to relevant column lRow = .Range("A" amp; .Rows.Count).End(xlUp).Row For i = 2 To lRow ZipString = .Cells(i, ZipCol).Value '~~gt; Check if the string contains ":" If InStr(1, ZipString, ":") Then ZipResult = Split(ZipString, ":") '.Cells(1, ZipCol) = ZipResult(1) '~~gt; For testing For j = LBound(ZipResult) To UBound(ZipResult) Debug.Print ZipResult(j) Next j End If Next i End With End Sub