Здравствуйте. Написал некий клас для заполнения контролов на форме значениями выбраной строки таблицы согласно таблице сопоставления (заголовок столбца таблицы, название контрола). Но столкунулся с проблеемой при установке значения для комбобокса - Combobox1.Value = vValue, еесли vValue - число. Появляется ошибка Could not set the value property. Invalid property value. При чем когда vValue - текст, все работает.
Combobox.Text - не подходит, так как Combobox содержит несколько столбцов, в первом обычно скрытый Id. Combobox.ColumnCount = 2 Combobox.BoundColumn = 1 Combobox.ColumnWidth = 0;
Этим достигается эффект, когда пользователь видит читаемый текст, а Combobox.Value выводит Id (1 столбец). Понимаю, что можно обойти установкой Text или Listindex, но это неудобно, так как приходится усложнять таблицу сопоставления. Также не охота переводить все числовые Id в Guid. Кто может подсказать в чем причина такого поведения комбобокса? Спасибо.
Dima S написал: что такого может содержать элемент массива, чтобы "затереть" данные другого элемента?
черт возьми - таки может! длина строки некоторых ячеек из последних 4 столбцов превышала максимальный размер данных в ячейке - из-за этого такой странный эффект. убрал последние 4 столбца - все пишет.
Извините что морочил голову) Может кому то пригодится и такой опыт)
упростил. получение массива из запроса опустим, ибо массив заполняется и исходный массив один и тот же для двух случаев. Все сводится к тому что
Код
tabl.DataBodyRange.Value = rezult 'Value2/Formula
не работает (то есть записывает только числовые и НЕКОТОРЫЕ СТРОЧНЫЕ значения)
Код
For i = LBound(rezult) To UBound(rezult)
For n = LBound(rezult, 2) To UBound(rezult, 2)
.DataBodyRange.Cells(i, n).Value = rezult(i, n)
Next n
Next i
записывает все как надо. массив rezult - один и тот же в обоих случаях. Если проблема в данных - то что такого может содержать элемент массива, чтобы "затереть" данные другого элемента?
Ощущение что есть лимит на размер массива. Потому что если в sql выборке установить лимит на количество строк, то при количестве строк до 4 - все записывается, больше - пропуски. В других - более узких таблицах количество строк без пропусков еще больше.
Я вообще не понимаю что происходит, так как эти функции (запрос к БД и запись массива ни лист) - общие для всех листов в книге, но при этом одни листы записываются нормально, а другие нет.
' transpose array -----------------------------------
ReDim arr_transposed_data(1 To UBound(arr_data, 2) + 1, 1 To UBound(arr_data) + 1)
For i = LBound(arr_transposed_data) To UBound(arr_transposed_data)
For n = LBound(arr_transposed_data, 2) To UBound(arr_transposed_data, 2)
arr_transposed_data(i, n) = arr_data(n - 1, i - 1)
Next n
Next i
только эта функция уже годы работала без проблем.
Попробовал все советы выше - результат неизменный.
Все филтры очищены. При выгрузке просто на лист, не в таблицу, или в новую таблицу на новом листе, в новой книге - такая же фигня. Или что то не так с данными, или очередное обновление майкрософта что то сломало. При этом больше склоняюсь ко второму варианту, ибо за прошлые периоды тоже такой глюк, хотя раньше все работало и данные никто не менял.
Пробовал и value2 и Formula - результат тот же. Как сейчас оказалось - это не единственная таблица в книге, у которой такой глюк. В массиве все данные есть. Ну и опять таки - если тот же массив записать циклом, то ОК, только долго.
При чем, если выбрать данные только за сегодня - то они записываються, если за болший период - то такой глюк.
Здравствуйте форумчане. Случилась такая неприятность. Есть функция для записи массива в таблицу - она там подгоняет размеры таблицы, форматирование и т.п. Непосредственно запись массива в таблицу делает строчка
Донедавна все это успешно работало, а сейчас выдает такой вот результат (bug.png) При этом если тот же массив записать в цикле
Код
For i = LBound(rezult) To UBound(rezult)
For n = LBound(rezult, 2) To UBound(rezult, 2)
.DataBodyRange.Cells(i, n) = rezult(i, n)
Next n
Next i
то все записывается нормально и результат уже такой (correct.png) Это происходит только с одним массивом в книге.
Файл прикреписть не могу, так как массив получается из базы данных. Соответственно если его записать на лист и потом считывать, то ошибки не происходит. Есть идеи что может вызывать подобное поведение? Оффис 365.
Здравствуйте. Столкнулся с такой не то что бы проблемой, но непоняткой. Пишу себе код в ВБА и иногда при каких то изменениях вылетает сообщение типа "Это остановит выполнение макроса" (это был неверный перевод) This action will reset your project и кнопки ОК, Отмена и Справка. Хотя в это время никакой макрос не выполняется и на паузе не стоит. Что это может быть? П.С. Файлик прикрепить не могу, так как он завязан на сетевое подключение к внутренней сети и там много всего. а вырезать что то и оставлять - не знаю что оставлять.
Здравствуйте. Из столбца С в вашу формулу ничего не попадает. По краней мере в примере. А так - пробуйте
Код
Sub Расчет()
Range("f3:f7").Formula = "=1/d3*100"
'если нужно заменить формулы на значения, то добавить
Range("f3:f7").Value = Range("f3:f7").Value
End Sub
RAN, вопрос не в том, чтобы формулу изменить - это я уже сделал. вопрос как адекватно очистить таблицу перед вставкой новых данных. ведь ламается не только УФ, но и "обычное"(см више).
что вы подразумеваете под "открыванием интернет-сайта по ссылке через VBA"? просто переход по ссылке через браузер или получение каких то данных в переменную?(при этом не обязательно показывать что либо пользователю)
sokol92 написал: Если, например, просто выделить часть строк "умной" таблицы
речь идет не просто о части строк, а о полном их удалении и последующей вставки новых данных, не поломав при этом вычисляемые столбцы, форматы столбцов и УФ.
Вот пример. RAN - ваш способ в макросе write_table2. Обратите внимание на УФ - оно ломается.
При перезаписи с помощью write_table - нет. Но появился другой баг - форматы с первой строки вроде бы копируются, но значения в этих форматах - только в первой строке, в остальных - срабатывает автоформат. если же продублировать строку
то все вставляется правильно. пока использую как временный костыль, ибо на больших массивах, думаю, будет лишняя задержка. У кого есть мысли почему так происходит?
Здравствуйте. Поделитесь способом пожалуйста, как по нормальному перезаписать таблицу? Проблема возникает, когда новых строк меньше, чем существующих. Пробовал варианты: 1. Вычислить разницу между новым и старым размером, удалить лишние строки в цикле как
Код
Do While .ListRows.Count > rows_count
.ListRows(.ListRows.Count).Delete
Loop
это быстро, но слетает условное форматирование, в котором ссылка на две строки таблицы. Вариант с ClearContents оставляет форматирование внизу. Вариант с удалением всей строки не подходит, так как влияет на другие таблицы на листе. По этой же причине не подходит.Listrows(i).range.resize(dif_rows).delete способа удаления нескольких listrows за раз не нашел.
PooHkrd написал: таблица, то это проще через Power Query все же сделать.
Нужна таблица, но я планирую перенести это дело в Power BI и выбирать дату с помощью разделителя. А как передать выбранную дату в Power Query я не знаю. В принципе и с DAX тоже проблемы. Создал CALENDARAUTO и меру
Код
CurDate = MAX('MyCalendar'[Date])
но почему то ни одно решение( решение PooHkrd все таки реагирует - у меня был какой то кривой виджет с магазина. со стандартным работает) не реагирует на выбранное в разделителе значение. Например в решении Андрея
lenatoy написал: как сделать по двум/трем и более признакам
например так - указать признак через разделитель, например запятую
Код
Sub Test()
Dim iCell As Range, Priznak As Variant
Priznak = Application.InputBox("признак переноса сроки", "Екатеринбург", "Екатеринбург")
Priznak = Split(Priznak, ",")
For Each iCell In Range("A2", [A2].End(xlDown))
For i = lbound(Priznak) To Ubound(Priznak)
If iCell = Priznak(i) Then
With Sheets("ЕКБ")
iCell.EntireRow.Copy Destination:=.Cells(.Cells(Rows.Count, "A").End(xlUp).Row + 1, "A")
End With
End If
Next i
Next iCell
MsgBox "строки скопированы на другой лист", vbInformation, ""
End Sub