Доброе утро! Тема очень похожа на эту "Разделение текста на массивы с их последующим переносом". Но исходная ячейка не одна, а неизвестное множество. Благо мы знаем первую исходную ячейку "B17", из этой первой ячейки: [E17] = Trim$(st(0)) т.е. 2-28-35 Ф ЯМ в ячейку E17 [C17] = Trim$(st(1)) т.е. л.с.2-9-1(1) в ячейку C17 [D17] = Trim$(st(3)), но не весь, а надо взять только последнюю числовую часть (иногда со знаком минус) т.е. -8 060 705 в ячейку D17 А в B17 оставить Trim$(st(3)), но уже без последней числовой части. И самое сложное, то что исходных ячеек "B" столбца неизвестное множество. Но все они начинаются с 17 строки (B17 ячейки). И заканчиваются всегда какой-то пустой "B" ячейкой (B25 в нашем примере)
Доброе утро! Тема очень похожа на эту "Разделение текста на массивы с их последующим переносом". Но исходная ячейка не одна, а неизвестное множество. Благо мы знаем первую исходную ячейку "B17", из этой первой ячейки: [E17] = Trim$(st(0)) т.е. 2-28-35 Ф ЯМ в ячейку E17 [C17] = Trim$(st(1)) т.е. л.с.2-9-1(1) в ячейку C17 [D17] = Trim$(st(3)), но не весь, а надо взять только последнюю числовую часть (иногда со знаком минус) т.е. -8 060 705 в ячейку D17 А в B17 оставить Trim$(st(3)), но уже без последней числовой части. И самое сложное, то что исходных ячеек "B" столбца неизвестное множество. Но все они начинаются с 17 строки (B17 ячейки). И заканчиваются всегда какой-то пустой "B" ячейкой (B25 в нашем примере)Yar4i4
Sub mac() For r = 17 To Rows.Count If Cells(r, 2) = "" Then Exit For a = Split(Cells(r, 2), "*") Cells(r, 3) = Trim$(a(1)) Cells(r, 5) = Trim$(a(0)) For p = Len(a(3)) To 1 Step -1 Debug.Print Mid$(a(3), p, 1) If Mid$(a(3), p, 1) Like "[!- 0-9]" Then Exit For Next Cells(r, 4) = Val(Mid$(a(3), p + 1)) Cells(r, 2) = Mid$(a(3), 1, p) Next r End Sub
[/vba]
Так? - [vba]
Код
Sub mac() For r = 17 To Rows.Count If Cells(r, 2) = "" Then Exit For a = Split(Cells(r, 2), "*") Cells(r, 3) = Trim$(a(1)) Cells(r, 5) = Trim$(a(0)) For p = Len(a(3)) To 1 Step -1 Debug.Print Mid$(a(3), p, 1) If Mid$(a(3), p, 1) Like "[!- 0-9]" Then Exit For Next Cells(r, 4) = Val(Mid$(a(3), p + 1)) Cells(r, 2) = Mid$(a(3), 1, p) Next r End Sub
Да. Всё работает. Я думал у вас проблемы возникнут с ячейкой B22, ведь в ней идет последняя числовая часть для переноса через точку "V=3х25м3. 2 125 434*" СПАСИБО+
Да. Всё работает. Я думал у вас проблемы возникнут с ячейкой B22, ведь в ней идет последняя числовая часть для переноса через точку "V=3х25м3. 2 125 434*" СПАСИБО+Yar4i4
столкнулся с числом типа "1,11" и макрос думает, что запятая в нецелом числе - это "p" и переносит все после запятой. Изменял регулярное выражение [vba]
Код
If Mid$(a(3), p, 1) Like "[!- ,0-9]" Then Exit For
[/vba] этот вид работает в определённых условиях (при именовании файла в другом макросе) - а в данном примере упёрся и переносит либо целую часть числа, либо десятые, сотые...
столкнулся с числом типа "1,11" и макрос думает, что запятая в нецелом числе - это "p" и переносит все после запятой. Изменял регулярное выражение [vba]
Код
If Mid$(a(3), p, 1) Like "[!- ,0-9]" Then Exit For
[/vba] этот вид работает в определённых условиях (при именовании файла в другом макросе) - а в данном примере упёрся и переносит либо целую часть числа, либо десятые, сотые...Yar4i4
Сообщение отредактировал Yar4i4 - Суббота, 09.04.2016, 13:04
В этой строке вместо Val используйте CDbl. Val не распознает запятую частью числа, а распознает только точку [vba]
Код
Cells(r, 4) = CDbl(Mid$(a(3), p + 1))
[/vba] В столбце D измените формат ячеек, сейчас в книге формат числовой без цифр после запятой, поэтому дробные числа будут обрезаться. И удалите эту строку (она использовалась для тестирования и сейчас не делает ничего) [vba]
Код
Debug.Print Mid$(a(3), p, 1)
[/vba]
В этой строке вместо Val используйте CDbl. Val не распознает запятую частью числа, а распознает только точку [vba]
Код
Cells(r, 4) = CDbl(Mid$(a(3), p + 1))
[/vba] В столбце D измените формат ячеек, сейчас в книге формат числовой без цифр после запятой, поэтому дробные числа будут обрезаться. И удалите эту строку (она использовалась для тестирования и сейчас не делает ничего) [vba]
только что проиграл макрос и CDbl тоже не распознаёт, возможно из-за того что число с пробелами вида 1 111 111,11. когда формат ячеек выставляю заранее общий и текстовый, то переносятся только копейки и вставляются они как целые числа, т.е. 11 а если ячейки представить в числовом формате, то переносятся опять копейки, но в должном виде, т.е. 0,11 целая же часть остаётся вместе с текстом
только что проиграл макрос и CDbl тоже не распознаёт, возможно из-за того что число с пробелами вида 1 111 111,11. когда формат ячеек выставляю заранее общий и текстовый, то переносятся только копейки и вставляются они как целые числа, т.е. 11 а если ячейки представить в числовом формате, то переносятся опять копейки, но в должном виде, т.е. 0,11 целая же часть остаётся вместе с текстомYar4i4
Sub mac() Columns(4).NumberFormat = "#,##0.00" For r = 17 To Rows.Count If Cells(r, 2) = "" Then Exit For a = Split(Cells(r, 2), "*") Cells(r, 3) = Trim$(a(1)) Cells(r, 5) = Trim$(a(0)) For p = Len(a(3)) To 1 Step -1 'Debug.Print Mid$(a(3), p, 1) If Mid$(a(3), p, 1) = "," Then Mid$(a(3), p, 1) = "." If Mid$(a(3), p, 1) Like "[!-. 0-9]" Then Exit For Next Cells(r, 4) = Val(Mid$(a(3), p + 1)) Cells(r, 2) = Mid$(a(3), 1, p) Next r End Sub
[/vba]
Отступы размеров в два пробела (я себе такие настраиваю обычно) съедаются движком, что несколько удручает, отображение плохо читаемое и нубское...
[vba]
Код
Sub mac() Columns(4).NumberFormat = "#,##0.00" For r = 17 To Rows.Count If Cells(r, 2) = "" Then Exit For a = Split(Cells(r, 2), "*") Cells(r, 3) = Trim$(a(1)) Cells(r, 5) = Trim$(a(0)) For p = Len(a(3)) To 1 Step -1 'Debug.Print Mid$(a(3), p, 1) If Mid$(a(3), p, 1) = "," Then Mid$(a(3), p, 1) = "." If Mid$(a(3), p, 1) Like "[!-. 0-9]" Then Exit For Next Cells(r, 4) = Val(Mid$(a(3), p + 1)) Cells(r, 2) = Mid$(a(3), 1, p) Next r End Sub
[/vba]
Отступы размеров в два пробела (я себе такие настраиваю обычно) съедаются движком, что несколько удручает, отображение плохо читаемое и нубское...Апострофф
Сообщение отредактировал Апострофф - Понедельник, 11.04.2016, 08:17