Страницы: 1 2 След.
RSS
Ячейка с накоплением (нарастающим итогом), содержащим дату и текст
 
Добрый день.

Прошу оказать помощь в решении следующей задачи. Есть таблица, в ней  два столбца «А» и «В». В столбец «В» вводится информация в формате: 01.01.2018 обратился за помощью на форум . Даная запись должна переносится в столбец «А» и сохраняться в столбце «В» до внесения следующей записи. При внесении записи в столбец «В»: 02.01.2018 получил квалифицированный ответ на форуме , данная запись должна добавится в столбец «А». В результате должно получиться в столбце «А»: 02.01.2018 получил квалифицированный ответ на форуме;  01.01.2018 обратился за помощью на форум; Последняя запись должна добавляться первой в ячейке столбца «А», разделитель между записями «;».

Информацию необходимо будет вводить на 10 000 строках. Столбец «А» будет защищен от редактирования, так чтобы в нем нельзя было работать пользователям.

Для того, что бы не нагромождать таблицу, привожу только два столбца.
Это конечно если возможно в Эксель, версия Эксель 2010 года. Добавить файл нет возможности, не пропускает. Если есть крайняя необходимость, попробую добавить из дому. Заранее благодарен, кто откликнулся.
Изменено: Новичок_ - 10.09.2018 16:47:56
 
Если я правильно понял задание, то добавление этого кода в модуль листа должно помочь:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Len(Cells(Target.Row, 1).Value) > 0 Then Cells(Target.Row, 1).Value = "; " & Cells(Target.Row, 1).Value
        Cells(Target.Row, 1).Value = Cells(Target.Row, 2).Value & Cells(Target.Row, 1).Value
    End If
End Sub
Изменено: Ts.Soft - 10.09.2018 17:01:30
Не стреляйте в тапера - он играет как может.
 
Если я правильно понимаю: Новичку нужно сцеплять текст ячейки из столбца А с текстом ячейки из столбца B (той же строки?) после изменения содержимого последней.
Формулами этого сделать не получится. Только при помощи VBA.
Более того, я настоятельно рекомендую настроить защиту от случайного изменения данных в столбце B (подтверждение копирования...).

Без примера исходных данных (несекретных!) и желаемого результата Вы рискуете довольно долго дожидаться более конкретных советов.
 
Ts.Soft, Target.Column = 2 вернёт ошибку, если столбцов в Target больше одного. Нужно через Intersect проверять.
 
Ts.Soft, Кажись работает. Я реально не думал, что такое возможно. Спасибо огромное. А можно вопрос: если столбцы не "А" и "В", а скажем "AI" и "AJ", где менять в коде номер колонки. Для меня макросы темный лес((
И еще если можно вопрос, если на столбец "А" поставить защиту от изменения, то выдает ошибку, это как то исправляется?
Изменено: Новичок_ - 10.09.2018 18:07:52
 
Cells(Target.Row, 1) — в столбце A
Cells(Target.Row, 2) — в столбце B...
Принцип понятен?
Изменено: StoTisteg - 10.09.2018 17:55:19
 
Ещё можно так: Cells(Target.Row, "B")
 
Юрий М, честно? вообще не понятно, но по таким пустякам не буду отвлекать Вас, буду искать в инете.
И так много сделали. Спасибо.
 
А что непонятно? Вместо номера столбца подставляем его букву (в кавычках). Иногда это удобнее ))
 
StoTisteg, Юрий М, так со столбцами вроде разобрался, что зачем. Теперь вопрос, а почему код не срабатывает, если защитить столбец "А" паролем от изменения. Просто это очень принцыпиально, что бы "А" нельзя было изменять.
 
Если стоит защита на изменение - конечно не будет работать. Нужно программно снимать защиту, затем присваивать значение, а после этого снова ставить защиту. Правда, есть вариант, когда можно макросу разрешить работать в защищённых ячейках, но, боюсь, этот вариант будет сложен для Вас ((
 
Новичок_, прочтите статью Как защитить лист от пользователя, но не от макроса? Если действительно покажется сложным, то на этом форуме уже обсуждались проблемы снятия и установки защиты, например здесь
Кстати, вы не описали что должно происходить если пользователь удалит текст из ячейки в столбце "B" или захочет его исправить.

Юрий М, видно что человек хочет не просто использовать готовое решение, а пробует разобраться что к чему. Пусть почитает, тем более The_Prist написал так, что даже я понял :)  
Изменено: Ts.Soft - 10.09.2018 22:47:20
Не стреляйте в тапера - он играет как может.
 
Я именно про этот вариант и говорил )
 
Ts.Soft,
Цитата
Ts.Soft написал:
Кстати, вы не описали что должно происходить если пользователь удалит текст из ячейки в столбце "B" или захочет его исправить.
Текст должен сохранятся в ячейке столбца "А" по накопительному принципу. Если запись в столбце "В" удалить или изменить, она сохраняется в столбце "А"
А вот с защитой "играюсь". Прочитал статьи, буду разбираться как применить их. Спасибо за помощь еще раз.
 
Короче перечитал статьи по ссылкам, ничего не получается. Ребята, кто сможет помочь, решить проблему, что бы этот код работал, если защитить столбец "А" от изменений на фале "Пример" Ts.Soft. Буду признателен.
 
Цитата
Новичок_ написал:
Если запись в столбце "В" удалить или изменить, она сохраняется в столбце "А"
Это понятно, что она сохраняется. вопрос был в том, что если в "A" что есть и при этом в "B" удалить старый текст (который уже есть в "A"), то в "A" появится разделитель с пробелом: "; " плюс то что было в "A". Чтобы этого не возникало добавил условие.
Так же настоятельно рекомендую подумать об исправлениях. Насколько я понял данные в "B" будет заносить человек, а людям свойственно ошибаться, ведь даже в слове "хлеб" можно допустить четыре ошибки и получить слово "пиво". Вот напишет человек "кАрова", заметит ошибку, исправит, а в "A" получится "кОрова; кАрова". Т.п. нужно решить проблему очепяток.

Ну а по поводу защиты смотрите примеры. В первом перед изменением защита снимается, а потом устанавливается. Во втором при открытии книги (в модуле Книги) устанавливается защита от пользователя, но не от макроса. Пароль - "111".
Не стреляйте в тапера - он играет как может.
 
Ts.Soft, Спасибо Вам огромное.
Цитата
Ts.Soft написал:
Это понятно, что она сохраняется. вопрос был в том, что если в "A" что есть и при этом в "B" удалить старый текст (который уже есть в "A"), то в "A" появится разделитель с пробелом: "; " плюс то что было в "A". Чтобы этого не возникало добавил условие.
Вы знаете, я и так рад был Вашей помощи, что на ";" уже не обращал внимания
А можно еще один вопрос: в каком месте кода нужно менять очередность заполнения ячейки. У нас инфо добавляется в начале, а если есть необходимость что бы внизу ячейки. То есть поменять очередность наполнения ячейки.  
 
В ТЗ было русским по белому сказано:
Цитата
Новичок_ написал:
Последняя запись должна добавляться первой в ячейке столбца «А», разделитель между записями «;».
Ну а для того чтобы поменять очерёдность заполнения нужно изменить две строки - добавление разделителя (при необходимости) и собственно дополнение ячейки:
Код
If Len(Cells(Target.Row, 1).Value) > 0 And Len(Cells(Target.Row, 2).Value) > 0 Then Cells(Target.Row, 1).Value = Cells(Target.Row, 1).Value & "; "
Cells(Target.Row, 1).Value = Cells(Target.Row, 1).Value & Cells(Target.Row, 2).Value 
Изменено: Ts.Soft - 11.09.2018 22:02:49
Не стреляйте в тапера - он играет как может.
 
Ts.Soft, Не, Вы все чётко сделали. Просто интересна структура кода. А так вообще всё на высоте.  
 
Добрый день. Извиняюсь, что реанимировал тему.
Уважаемые эксперты, подскажите пожалуйста, возможно ли внести в даний код изменения таким образом, что бы код работал еще с одной ячейкой. В данном коде задействованы ячейки столбца 1 и 2, а что нужно изменить, что бы можно было вносить изменения в ячейку столбца 3 и накопление было в столбце 4.
Спасибо заранее.    
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Column = 2 Then
        If Len(Cells(Target.Row, 1).Value) > 0 Then Cells(Target.Row, 1).Value = "; " & Cells(Target.Row, 1).Value
        Cells(Target.Row, 1).Value = Cells(Target.Row, 2).Value & Cells(Target.Row, 1).Value
    End If
End Sub
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sTxt As String
Dim j As Byte
    If Not Application.Intersect(Range("B:C"), Target) Is Nothing Then
        With Target
            Select Case .Column
            Case 2: j = 1
            Case 3: j = 4
            End Select
            
            sTxt = Cells(.Row, j).Value
            sCells(.Row, j).Value = Cells(.Row, .Column).Value
            If Len(sTxt) > 0 Then Cells(.Row, j).Value = sCells(.Row, j).Value & "; " & sTxt
        End With
    End If
End Sub
 
vikttur,спасибо что потратили время, но почему то выдает ошибку(
Изменено: Новичок_ - 05.05.2019 12:05:32
 
s - мусор, уберите.
Вы же в файле не показали (и опять примера нет, только картинка!), вот и писал на коленке.
 
vikttur, какой мусор?
 
sCells
 
vikttur,получилось, спасибо Вам огромное, реально выручили))
 
Как говориться аппетит приходит во время еды, спрашиваешь о малом, а потом хочется все больше и больше)))
Подскажите, как в этом коде
Private Sub Worksheet_Change(ByVal Target As Range)Dim sTxt As String
Dim j As Byte
   If Not Application.Intersect(Range("B:C"), Target) Is Nothing Then
       With Target
           Select Case .Column
           Case 2: j = 1
           Case 3: j = 4
           End Select
           
           sTxt = Cells(.Row, j).Value
           Cells(.Row, j).Value = Cells(.Row, .Column).Value
           If Len(sTxt) > 0 Then Cells(.Row, j).Value = Cells(.Row, j).Value & "; " & sTxt
       End With
   End If
End Sub

Добавлять еще возможность вносить данные в ячейки, а накапливались они в других. Например добавить еще колонки F,K,M, и соответственно накопление было в АА, АВ, АС.
Менял "B:C,F,K,M", добавляя Case 6: j = 27  Case 11: j = 28 Case 13: j = 29

Выдает ошибку
 
Цитата
Новичок_ написал:
Например добавить еще колонки F,K,M, и соответственно накопление было в АА, АВ, АС.
Но контролируете Вы только 2 столбца:
Цитата
Новичок_ написал:
Range("B:C")
Добавьте в контролируемый диапазон нужные столбцы. Если и после этого не получится - покажите на небольшом файле проблему.
 
Код от Vikkturработает четко, а вот если добавить новые столбцы, код выдает ошибку
 
Исправьте диапазоны: (Range("B:C, F:F, K:K, M:M"), Target)
И добавьте отключение/включение отслеживания событий
Страницы: 1 2 След.
Наверх