PDA

Показать полную графическую версию : [решено] Записать столбец в одну ячейку строкой


blackeangel
05-05-2016, 17:55
Помогите решить проблему.
Этот код

Sub vstroky()
Ncolumn = Cells.Find(What:="№ операции", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
Ncolumn3 = Cells.Find(What:="Код операции стал", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
J = 2
For K = 2 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(J, Ncolumn).Value = "5" Then
st = ""
End If
st = st & "-" & ActiveSheet.Cells(J, Ncolumn3).Value
J = J + 1
ActiveSheet.Cells(K, 9).NumberFormat = "@"
ActiveSheet.Cells(K, 9) = Mid$(st, 2)
Next
End Sub

Работает не правильно. Что то я с циклом там напутал.
В прикрепленном файле 3 листа: с исходными данными,
с тем как получается у меня и как должно быть.

NickM
06-05-2016, 06:28
blackeangel, здесь (http://forum.oszone.net/thread-313873.html) подсмотрите.

blackeangel
06-05-2016, 09:13
blackeangel, здесь (http://forum.oszone.net/thread-313873.html) подсмотрите.
Что то ничего не нашёл. У меня ошибка в цикле. Не пойму никак. Либо надо разбить на 2 цикла, но как - не знаю.

a_axe
06-05-2016, 14:34
Помогите решить проблему. »
используйте код ниже - в приложенном вами файле желаемый результат совпадает с результатом работы кода.
Sub vvvky3()
Dim n As Long, i As Long, i0 As Long, j As Long
Dim strTxt As String, k As Integer
i0 = 2
ncolumn = Cells.Find(What:="№ операции", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
ncolumn3 = Cells.Find(What:="Код операции стал", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
n = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
For i = 3 To n
If ActiveSheet.Cells(i, ncolumn).Value = 5 Or i = n Then
If i = n Then i = i + 1
strTxt = ActiveSheet.Cells(i0, ncolumn3).Value
For j = i0 + 1 To i - 2
strTxt = strTxt & "-" & ActiveSheet.Cells(j, ncolumn3).Value
Next j
k = 0
Do
k = k + 1
Loop While IsNumeric(Right(ActiveSheet.Cells(i - 1, ncolumn3).Value, k)) And Len(ActiveSheet.Cells(i - 1, ncolumn3).Value) < k
strTxt = strTxt & "-" & Left(ActiveSheet.Cells(i - 1, ncolumn3).Value, k)
k = Val(Right(ActiveSheet.Cells(i - 1, ncolumn3).Value, k))
For j = i - 1 To i0 Step -1
If k >= 0 Then ActiveSheet.Cells(j, ncolumn3 + 2).Value = strTxt & k Else ActiveSheet.Cells(j, ncolumn3 + 2).Value = strTxt & (-k)
k = k - 1
Next

i0 = i
End If
Next i
End Sub

blackeangel
06-05-2016, 15:29
a_axe, вкладка должно быть оказалась неправильная
Вот правильный

a_axe
06-05-2016, 15:51
вкладка должно быть оказалась неправильная »
Sub vvvky2()
Dim n As Long, i As Long, i0 As Long, j As Long
Dim strTxt As String, k As Integer
i0 = 2
ncolumn = Cells.Find(What:="№ операции", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
ncolumn3 = Cells.Find(What:="Код операции стал", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns).Column
n = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
For i = 3 To n
If ActiveSheet.Cells(i, ncolumn).Value = 5 Or i = n Then
If i = n Then i = i + 1
strTxt = ActiveSheet.Cells(i0, ncolumn3).Value
For j = i0 + 1 To i - 1
strTxt = strTxt & "-" & ActiveSheet.Cells(j, ncolumn3).Value
Next j

ActiveSheet.Range(Cells(i0, ncolumn3 + 2), Cells(i - 1, ncolumn3 + 2)).Value = strTxt

i0 = i
End If
Next i
End Sub
blackeangel, если постановка задачи снова поменяется - добровольно откажусь от участия в данной теме - просто принимая во внимание Правила раздела (http://forum.oszone.net/announcement-115-177.html) (3. Темы в форуме создаются по принципу «одна проблема - одна тема».).

blackeangel
06-05-2016, 18:13
a_axe, почему j начинается с 3? А не с 2 ?

a_axe
06-05-2016, 18:31
вероятно имеется ввиду i, она начинается с 3. Изначально двум равно i0, т.к. в строке номер 2 заведомо находится начало обрабатываемого диапазона, и равна ячейка 5 (смотрю ваш пример).т.е. i0 - текущая найденная строчка с ячейкой =5, и первая такая строка заведомо вторая, поэтому изначально i0=2, i=3. Нет смысла проверять то, что и так известно, да и не ясно, что должна сделать программа, если во 2 строке будет не 5.

blackeangel
06-05-2016, 18:50
a_axe, если вы все таки внимательно посмотрели что должно получиться, в исправленом примере, то наверняка дагодались бы что это так сказать промежуток от 5 до 5ки следующей в которой должен собирать в одну ячейку. Так сказать отрезок у которого последняя 5ка не входит.
Если будет не 5 то она отработает криво и будет права, тк данные до этого подготавливаются. Ну можно сделать проверку на это и выход из саба, но для меня это бессмысленно.
Первая строка всегда заголовок столбца, поэтому со второй.
На счет 3, то есть данные во 2ю строку не попадут, тк цикл идет с 3 до последней.

a_axe
06-05-2016, 19:12
a_axe, если вы все таки внимательно посмотрели что должно получиться, в исправленом примере, то наверняка дагодались »
blackeangel, вот я беру ваш исправленный пример, запускаю код, в соседний столбец забиваю формулу "=ЕСЛИ(C2=D2;1;0)", везде получаю единички, т.е.в приложенном вами файле желаемый результат совпадает с результатом работы кода »
Если вы считаете по-другому - укажите ячейки, где код получил что-то отличное от вашего примера. Все ровно так, как вы хотите получить.
Если будет не 5 то она отработает криво и будет права »
разумеется, ведь в вашем примере стоит именно 5, и нигде не указано, что может быть иначе и что в этом случае делать.
для меня это бессмысленно. »
для меня этот факт не очевиден.
то есть данные во 2ю строку не попадут, тк цикл идет с 3 до последней. »
Это не так. Вы вообще код запускали? Что получается посмотрели? У вас строка 2 пустая, вы это хотите сказать?

Из конструктивных предложений - чтобы понять, как код работает могу предложить ознакомится с очень полезными ссылками (https://yandex.ru/yandsearch?clid=2028026&text=%D0%BE%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0+%D0%BA%D0%BE%D0%B4%D0%B0+%D0%B2+vba&lr=2&redircnt=1462550938.1) (без всякой иронии, речь о пошаговом выполнении кода).

blackeangel
06-05-2016, 21:25
a_axe, спасибо за наводку, не знал что в вб есть пошаговая отладка.
Нет, код еще не запускал. Просто читаю что написано.

blackeangel
07-05-2016, 09:20
a_axe, проверил, работает и так как надо.
А не могли бы пояснить несколько моментов:
1) Or i = n зачем?
2) в упор не вижу где цикл по i0
3) For j = i0 + 1 To i - 1 почему?

a_axe
09-05-2016, 23:35
1) Or i = n зачем? »
код ищет диапазон между двумя ячейками со значением =5. В самом низу вашего диапазона цифры 5 нет, но номер последней строки заполненного диапазона хранится в переменной n. Соответственно, ситуация, когда i=n означает, что мы проверили все ячейки, и работу кода пора останавливать, несмотря что цифру 5 он не нашел (замыкающей пятерки просто-напросто нет).
в упор не вижу где цикл по i0 »
Переменная i0 хранит номер строки, которая является первой в текущем обрабатываемом диапазоне. Цикла по i0 не нужно - где нашли "5", там и нашли. Задачи под такой цикл нет.
3) For j = i0 + 1 To i - 1 почему? »
цель этого цикла - склеить значения всех ячеек текущего диапазона - от ячейки =5 до следующей ячейка, равной 5 или последней заполненной ячейки. Это будут строчки от №i0 до №i-1. После этого i0 станет равна i, а код начнет искать следующую пятерку.

blackeangel
10-05-2016, 20:19
a_axe, теперь понял. Все элементарно оказывается . Спасибо.




© OSzone.net 2001-2012