В свое время возникла потребность добавить несколько функций к обычной таблице, дабы было удобнее контролировать процесс изготовления заказов и следить за расходами. Уже после добавления первой упрощенной функции было понятно, что на этом будет сложно остановиться и через пару месяцев постоянных дополнений ту первоначальную табличку с клиентами было совсем уж и не узнать. В этом примере я постараюсь объяснить, что да как работает в моей “программе” в силу своих возможностей (я не являюсь программистом) Сначала объясню, что вообще хотелось получить: 1) Нужна была таблица, в которой можно было бы вести учет клиентов, заказов (с возможностью отслеживать стадии от заготовки до отправки), денежных средств (как долги у клиентов, так и общая прибыль по клиентам) 2) На первой странице нужно получить список всех клиентов и тут же увидеть есть ли у них заказы или же денежные долги, а также кол-во материала, требуемое для изготовления заказа. 3) У каждого клиента должен быть свой собственный лист, на котором можно получить детальную информацию по заказам, а также должны быть формы, которые позволяют быстро добавлять информацию о новом заказе, о статусе выполнения заказа и др. вспомогательные элементы. Плюс необходимо иметь возможность быстро ориентироваться в данных таблицы для чего была применена цветовая схема, которая закрашивала строки с разными статусами в определенные цвета.
Посмотреть видео работы таблицы можно тут.
Для корректной работы примера нужно включить вот эти библиотеки в VBA (зайти в Tools / references и поставить галочки):
Увы, 160 кБ (да еще в архивах) при разрешенных 100. Извините... [МОДЕРАТОР]
вроде и сам сделал, правда пришлось внести код в саму форму через Private Sub vychislenie(), а в код кнопки вызов по vychislenie (жаль что просто создав модуль так не получается)
Здравствуйте. Интересует такой вопрос: Есть Форма в которой пользователь выбирает значение из нескольких выпадающих списков и при нажатии на кнопку на основе выбранного должно произойти вычисление. Однако все эти Ифы и Селект кейсмы (например If combo1.text="1" then ...) занимают довольно много места на экране из-за того что значений в списках довольно много. Вот и я задался вопросом - можно ли это перенести в отдельный модуль, а в код нажатия кнопки вставить его вызов ?
Меня сподвигло к таким телодвижениям то, что в будущем количество как и наименования столбцов в базе данных могут меняться и дабы не переписывать программу нужно сразу воспользоваться масштабируемым кодом
я пошел вот по такому пути:
1) определяем кол-во столбцов в нужной таблице нашей БД
Код
Dim fldCount As Integer
fldCount = rec.Fields.Count
2) создаем массив который наполняем именами столбцов
Код
Dim Array_Var() As String
For iCol = 1 To fldCount
ReDim Preserve Array_Var(iCol - 1)
Array_Var(iCol - 1) = rec.Fields(iCol - 1).Name
Next
3) наполняем БД
Код
kolvo = ActiveSheet.Cells(Rows.Count, 2).End(xlUp).Row 'узнаем последнюю заполненную строку во втором столбце (в моем случае 2-ой столбец самый показательный)
Dim gg As String
Dim ff As String
Dim tt As String
For k = 8 To kolvo
tt = "INSERT INTO " & idklientabd
For i = 0 To fldCount - 1
gg = gg & Array_Var(i)
If i <> (fldCount - 1) Then gg = gg & ", "
ff = ff & "'" & ActiveSheet.Cells(k, i + 1) & "'"
If i <> (fldCount - 1) Then ff = ff & ", "
Next i
cmd.CommandText = tt & " (" & gg & ") VALUES (" & ff & ")"
cmd.Execute
gg = ""
ff = ""
Next k
Здравствуйте уважаемые форумчане. В данный момент я использую при заполнении таблицы БД следующий код:
Код
Do While Not rec.EOF ' очищаю базу данных (в моем случае это более простой способ заполнение базы - сначала все удалить, потом наполнить)
rec.Delete
rec.MoveNext
Loop
kolvo = Sheets(idklienta).Cells.SpecialCells(xlCellTypeLastCell).Row ' узнаю последнюю строку в таблице эксель
For i = 8 To kolvo
bd1 = Sheets(idklienta).Range("A" & i)
bd2 = Sheets(idklienta).Range("B" & i)
bd3 = Sheets(idklienta).Range("C" & i)
bd4 = Sheets(idklienta).Range("D" & i)
cmd.CommandText = "INSERT INTO " & idklientabd & " (`id`, `data`, `stoimost`, `komentarii`) VALUES ('" & bd1 & "','" & bd2 & "','" & bd3 & "','" & bd4 & "'')"
cmd.Execute
next i
Однако со временем столбцов станет больше и из-за этого мне кажется что данный код не очень то масштабируемый - возможно есть способ вносить данные в столбец не указывая его имя, а указывать его номер ? Если так нельзя то быть может есть способ создать массив состоящий из имен заголовков столбцов и уже через него записывать данные.
Здравствуйте. Пожалуйста подскажите как удалить строки чьи ячейки выделены, при этом если вдруг случайно выделена ячейка хоть одной из строк с 1 по 7 то выдавалась бы предупреждение об ошибке (в этих строках важная информация которую нельзя потерять)
например выделены ячейки D20:F20 и E9 - нужно удалить строки 9 и 20
Grr написал: десь я получаю значения введенные в предыдущую пару текст боксов и присваиваю полученное значение вновь созданным элементам формы
Извините, но я не понял - что бы присвоить переменной данные из текстбокса как нужно к нему обратиться ? к обычному текстбоксу я обращаюсь так perem = textbox1.text
но подобным образом получить значение из tb1 не получается ((
Спасибо за пример - однако буду очень благодарен если поясните некоторые моменты:- 1) какие имена получаются у текст боксов (возможно нужно получать значение которое введено в них каким то специфическим образом, или можно и так text1.text ) 2) что значит On Error Resume Next: .Value = UserForm1.Controls("tb" & (CurrentNumber * 2 - 2 + i)).Value 3) что значит Set aCommands(X).DieCmds = obTemp
Пожалуйста подскажите как скопировать определенные элементы на форме (с сохранением свойств) и расположить их ниже существующих.
Например на форме есть два комбобокса (combo1 и combo2 ) и тесктбокс (text1) и нужно, что бы при нажатии на кнопку на форме появились еще два комбобокса (combo3 и combo4), а так же текстбокс (text2) . При повторном нажатии на кнопку так же копируются и вставляются эти элементы.
содержание комбобоксов (combo1 и combo2) задается в
Спасибо - дальше буду пытаться разбираться - просто это действие заменяет несколько тех что пришлось бы сделать моим методом . Еще раз ОГРОМНОЕ спасибо
Да -так более понятно )) Я опробовал код в действии - все замечательно ! И под это дело мне пришла в голову мысль как можно еще улучшить таблицу, но для этого нужно под конец операции по смене цвета сделать так, что бы была выделена строка которая находится ближе к началу. Например мы поменяли цвет в ячейках A20:M20, A18:M18, A17:M17, A8:M8 - нужно что бы под конец операции строка A8 была выделена
Здравствуйте. столкнулся с задачкой которая мне не по силам (( Суть задачи такова : нужно изменить цвет ячеек в диапазоне Ax:Mx в тех строках листа где пользователь выделил ячейки (пользователь может выделить и более одной ячейки в строке, но это не имеет значение - главное именно то что ячейки выделены в нужных строках)
До этого я работал только с одной строкой где выбрана ячейка и использовал вот такой код:
Код
Dim arow As Integer
Dim nrow As String
arow = ActiveCell.Row
nrow = "A" & arow & ":M" & arow
ActiveSheet.Range(nrow).Interior.Color = RGB(198, 224, 180)