Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Microsoft Office (Word, Excel, Outlook и т.д.) (http://forum.oszone.net/forumdisplay.php?f=115)
-   -   [решено] Записать столбец в одну ячейку строкой (http://forum.oszone.net/showthread.php?t=314596)

blackeangel 05-05-2016 17:55 2632205

Записать столбец в одну ячейку строкой
 
Помогите решить проблему.
Этот код
Код:

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 2632328

blackeangel, здесь подсмотрите.

blackeangel 06-05-2016 09:13 2632346

Цитата:

Цитата NickM (Сообщение 2632328)
blackeangel, здесь подсмотрите.

Что то ничего не нашёл. У меня ошибка в цикле. Не пойму никак. Либо надо разбить на 2 цикла, но как - не знаю.

a_axe 06-05-2016 14:34 2632465

Цитата:

Цитата blackeangel
Помогите решить проблему. »

используйте код ниже - в приложенном вами файле желаемый результат совпадает с результатом работы кода.
код
Код:

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 2632476

a_axe, вкладка должно быть оказалась неправильная
Вот правильный

a_axe 06-05-2016 15:51 2632483

Цитата:

Цитата blackeangel
вкладка должно быть оказалась неправильная »

код
Код:

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, если постановка задачи снова поменяется - добровольно откажусь от участия в данной теме - просто принимая во внимание Правила раздела (3. Темы в форуме создаются по принципу «одна проблема - одна тема».).

blackeangel 06-05-2016 18:13 2632518

a_axe, почему j начинается с 3? А не с 2 ?

a_axe 06-05-2016 18:31 2632527

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

blackeangel 06-05-2016 18:50 2632532

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

a_axe 06-05-2016 19:12 2632541

Цитата:

Цитата blackeangel
a_axe, если вы все таки внимательно посмотрели что должно получиться, в исправленом примере, то наверняка дагодались »

blackeangel, вот я беру ваш исправленный пример, запускаю код, в соседний столбец забиваю формулу "=ЕСЛИ(C2=D2;1;0)", везде получаю единички, т.е.
Цитата:

Цитата a_axe
в приложенном вами файле желаемый результат совпадает с результатом работы кода »

Если вы считаете по-другому - укажите ячейки, где код получил что-то отличное от вашего примера. Все ровно так, как вы хотите получить.
Цитата:

Цитата blackeangel
Если будет не 5 то она отработает криво и будет права »

разумеется, ведь в вашем примере стоит именно 5, и нигде не указано, что может быть иначе и что в этом случае делать.
Цитата:

Цитата blackeangel
для меня это бессмысленно. »

для меня этот факт не очевиден.
Цитата:

Цитата blackeangel
то есть данные во 2ю строку не попадут, тк цикл идет с 3 до последней. »

Это не так. Вы вообще код запускали? Что получается посмотрели? У вас строка 2 пустая, вы это хотите сказать?

Из конструктивных предложений - чтобы понять, как код работает могу предложить ознакомится с очень полезными ссылками (без всякой иронии, речь о пошаговом выполнении кода).

blackeangel 06-05-2016 21:25 2632593

a_axe, спасибо за наводку, не знал что в вб есть пошаговая отладка.
Нет, код еще не запускал. Просто читаю что написано.

blackeangel 07-05-2016 09:20 2632659

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

a_axe 09-05-2016 23:35 2633355

Цитата:

Цитата blackeangel
1) Or i = n зачем? »

код ищет диапазон между двумя ячейками со значением =5. В самом низу вашего диапазона цифры 5 нет, но номер последней строки заполненного диапазона хранится в переменной n. Соответственно, ситуация, когда i=n означает, что мы проверили все ячейки, и работу кода пора останавливать, несмотря что цифру 5 он не нашел (замыкающей пятерки просто-напросто нет).
Цитата:

Цитата blackeangel
в упор не вижу где цикл по i0 »

Переменная i0 хранит номер строки, которая является первой в текущем обрабатываемом диапазоне. Цикла по i0 не нужно - где нашли "5", там и нашли. Задачи под такой цикл нет.
Цитата:

Цитата blackeangel
3) For j = i0 + 1 To i - 1 почему? »

цель этого цикла - склеить значения всех ячеек текущего диапазона - от ячейки =5 до следующей ячейка, равной 5 или последней заполненной ячейки. Это будут строчки от №i0 до №i-1. После этого i0 станет равна i, а код начнет искать следующую пятерку.

blackeangel 10-05-2016 20:19 2633653

a_axe, теперь понял. Все элементарно оказывается . Спасибо.


Время: 19:05.

Время: 19:05.
© OSzone.net 2001-