Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Ненужный перенос строки в ячейке
 
Уважаемые гуру форума, растолкуйте, что за полтергейст завелся в моем любимом Excel. Скажу сразу с проблемой я разобрался, но вот почему она вылезала никак не пойму 8-0 Итак: кодом вставляю в ячейку листа строковое значение из листбокса, в соседней ячейке должна отработать ВПР с данными из первой ячейки. Код срабатывает - формула не работает. Проверяю код - все правильно, значение верно, проверяю ячейку - значение тоже правильное, но почему-то после слова стоит перенос строки. Понятно, что в таком случае для ВПР значение становиться неверным. ОК, захожу в свойства ячейки, убираю галочку с переноса строк, убираю сам перенос в ячейке. Проверяю - все опять с переносом. Проверяю пошагово, отслеживая кнопку переносить текст на панели, как только вставляется значение, кнопка оказывается нажатой. Проверяю, чисто для эксперимента на других ячейках - тоже самое. Одним словом, пока после этой заколдованной строки кода не вставил строку: .Range("F535").Replace Chr(10), "" не помогало ничего. Строчки кода, разумеется не жалко, но почему так получалось? Подскажите кто знает. Заранее спасибо всем откликнувшимся
 
Цитата
OlegO написал:
но почему-то после слова стоит перенос строки
потому что это особенность записи значений в ListBox. Каждое значение там представляет собой одну строку, завершающуюся обязательно символом переноса строки(vbNewLine). Сделано для того, чтобы сам ListBox мог разделить значения на строки между собой. При этом, если само единичное значение будет содержать внутри символ переноса - он будет удален.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо за отклик, Дмитрий, но тогда уж 2 вопроса для самообразования: как с вышеописанной проблемой бороться (как у меня или иначе?) и почему тогда (если как Вы пишете, такая ситуация в каждом значении листбокса) описанной ситуации не возникает при другом значении листбокса (из другого столбца). Сейчас специально проверил  в этом другом столбце может стоять и 1 слово и словосочетание, однако они БЕЗ переноса строк вставляются в ячейку
P.S. Проверял без .Replase
Изменено: OlegO - 15 Мар 2018 19:32:32
 
1. Бороться именно так
2. Надо видеть файл с этой проблемой и как Вы вставляете значения в ячейки(и как их забираете из ListBox-а).
Изменено: Дмитрий Щербаков - 15 Мар 2018 20:00:55
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Файл великоват размером, водиться с обрезкой ради уже решенной проблемы не стоит, но код выложить несложно. Листбокс формирую так:  
Код
      With CreateObject("Scripting.Dictionary"): .CompareMode = 1 'формирование словаря по данным исходного массива
            x = Sheets("Расход").Range("A2:H" & Sheets("Расход").Cells(Rows.Count, [Tovar_rashoda].Column).End(xlUp).Row).Value 'данные в массив
    
                For i = 1 To UBound(x) 'цикл на формирование списка документов
                    If Len(Me.Mes.Value) Then 'если месяц указан
                        If Month(x(i, 3)) & Year(x(i, 3)) = Month(Me.Mes.Value & "." & Me.God.Caption) & Me.God.Caption Then 'совпадение по месяцу и году расходного документа
                            temp = x(i, 2) & "|" & x(i, 3) & "|" & x(i, 4)  'номер док-та|дата док-та|потребитель
                            .Item(temp) = .Item(temp) + x(i, 7) * x(i, 8)
                        End If
                    Else
                        If Year(x(i, 3)) = Me.God.Caption Then 'совпадение по году расходного документа
                            temp = x(i, 2) & "|" & x(i, 3) & "|" & x(i, 4)
                            .Item(temp) = .Item(temp) + x(i, 7) * x(i, 8)
                        End If
                    End If
                Next i
                
                ReDim Arr_note(1 To .Count)
                For i = 1 To UBound(x) 'цикл на формирование списка секция|комментарий
                    If Len(Me.Mes.Value) Then 'если месяц указан
                        If x(i, 1) = "Н" Then
                            If Month(x(i, 3)) & Year(x(i, 3)) = Month(Me.Mes.Value & "." & Me.God.Caption) & Me.God.Caption Then 'совпадение по месяцу и году расходного документа
                                j = j + 1
                                Arr_note(j) = Sheets("Расход").Cells(i + 1, 2).Comment.Text & "|" & Sheets("Расход").Cells(i + 1, 4).Comment.Text
                            End If
                        End If
                    Else
                        If x(i, 1) = "Н" Then
                            If Year(x(i, 3)) = Me.God.Caption Then 'совпадение по году расходного документа
                                j = j + 1
                                Arr_note(j) = Sheets("Расход").Cells(i + 1, 2).Comment.Text & "|" & Sheets("Расход").Cells(i + 1, 4).Comment.Text
                            End If
                        End If
                    End If
                Next i

                j = 0
                On Error Resume Next
                ReDim Arr_data(1 To .Count, 1 To 6)
                For Each k In .Keys
                    Data = Split(k, "|")
                    j = j + 1
                    Arr_data(j, 1) = Format(Data(1), "dd.mm.yy") 'дата документа
                    Arr_data(j, 2) = CStr(Data(0)) 'номер документа
                    Arr_data(j, 3) = Data(2) 'потребитель
                    Arr_data(j, 4) = Format(CDbl(Split(.Item(k), "-")(0)), "0.00") 'сумма
                    Arr_data(j, 5) = Split(Arr_note(j), "|")(0) 'секция (столбец нулевой длины)
                    Arr_data(j, 6) = Split(Arr_note(j), "|")(1) 'наименование товара для договора (столбец нулевой длины)
                Next k
                    Me.Data.Clear
                    Me.Data.List = Arr_data
        End With
в итоге Arr_data(j, 5) =Иванова И.И., Arr_data(j, 6) = хозяйственные товары
вставляю в ячейку по двойному клику в листбоксе:
Код
 .Range("F535") = CStr(Me.Data.List(Me.Data.ListIndex, 4))
Ну и далее борюсь вышеописанным способом. Причем, если указать:
Код
 .Range("F535") = CStr(Me.Data.List(Me.Data.ListIndex, 5))
т.е. хозяйственные товары, данные вставятся нормально, без переноса, пробовал менять хозяйственные товары на обувь (для эксперимента :) ) - аналогично правильная вставка данных, без переносов
Изменено: OlegO - 15 Мар 2018 20:27:00
 
Здесь скорее всего проблема в том, что значения берутся из комментариев, данные в которые часто заносятся с лишним переносом строк на конце:
Код
.Comment.Text
Поэтому убирайте переносы строк на стадии заполнения массива и все будет в порядке.

P.S. Я думал копирование и вставка в ячейку происходит вручную
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо за совет, проверять и разбираться буду завтра, у меня уже полночь :(
P.S. не выдержал, решил проверить сразу. Вы были абсолютно правы, перенос висел в комментарии. Проблема решена, полтергейст побежден. Еще раз спасибо за помощь
Изменено: OlegO - 15 Мар 2018 21:03:45
Страницы: 1
Читают тему (гостей: 1)