Въвеждане на данни в ексел с VBA UserForm
Автор |
|
pmarchovskiПет, 06.04.18, 12:01 |
Здравейте, Имам една екселска табличка, в която искам да въвеждаме малко данни. Прикачвам самата таблица. В нея има два шиита. В първия има бутон с който извиквам юзер формата. В нея има няколко полета, които се попълват. Във втория шиит е мястото в което се записва всичко от формата. Това което ми се иска да се случва е следното. Задължително да има поръчка. Ако поръчката вече съществува, остнаналите полета да се записват срещу нея. Ако няма такава поръчка да се записва на нов (последния ред) заедно с останалата информация. Предварително благодаря за помоща. Input_form.xlsx | | pmarchovskiПет, 06.04.18, 12:08 |
Пропуснах само да отбележа, че данните срещу всяка поръчка могат да се въвеждат в различни дни. Например днес въвеждам само началната дата. Утре само крайната и т.н. Това означава, че въведените вече данни трябва да си остават дори и полето във формата да е празно, а да се записват само тези, които са попълнени във формата. | | naskobkПет, 06.04.18, 20:11 | редактиран от naskobk на 06.04.18 20:12 | | drevenСъб, 07.04.18, 11:07 | RE: Въвеждане на данни в ексел с VBA UserForm
”
Имам една екселска табличка, в която искам да въвеждаме малко данни. „ Написах ти действащ пример, но е на Excel 2003, тоест във формат xls. Твоя офис е по-нов и би трябвало да го отвори. Все пак не забравяй да си разрешиш макросите, за да се случват нещата. Това е сорса на макроса отварящ формата: Sub ShowForm1()
Form1.Show
End Sub |
Това е сорса на формата: Private Sub CommandButton1_Click()
If Form1.TextBox1.Text = "" Then GoTo izhod
Set tablica = Sheets("Data") ' Посочваме таблицата в която ще пишем
'''''''''''''''''''''''''ТЪРСИМ СТАРА ПОРЪЧКА'''''''''''''''''''''''''''''''
red = 0 'Нулираме брояча на редове
Do 'стартираме безкраен цикъл, защото не знаем броя на поръчките
red = red + 1
'Проверяваме за налична поръчка, за да определим реда, където да пишем
If tablica.Cells(red, 1) = "" Or tablica.Cells(red, 1) = Form1.TextBox1.Text Then
Exit Do
End If
Loop
'''''''''Записваме подадената информация, само за попълнено текстово поле'''''''''
If Form1.TextBox1.Text <> "" Then tablica.Cells(red, 1) = Form1.TextBox1.Text
If Form1.TextBox2.Text <> "" Then tablica.Cells(red, 2) = Form1.TextBox2.Text
If Form1.TextBox3.Text <> "" Then tablica.Cells(red, 3) = Form1.TextBox3.Text
If Form1.TextBox4.Text <> "" Then tablica.Cells(red, 4) = Form1.TextBox4.Text
If Form1.TextBox5.Text <> "" Then tablica.Cells(red, 5) = Form1.TextBox5.Text
'Почистваме полетата за нова поръчка или запис
Form1.TextBox1.Text = "": Form1.TextBox2.Text = "": Form1.TextBox3.Text = ""
Form1.TextBox4.Text = "": Form1.TextBox5.Text = ""
Exit Sub
izhod: MsgBox "Не е посочена поръчка"
End Sub |
Ето как изглежда формата:
Това е целият действащ пример: Input_form.xls Не забравяй, че това е специализиран софтуер по конкретна поръчка и е доста солен - бира Шуменско. | | pmarchovskiСъб, 07.04.18, 15:15 |
Супер си. Точно това ми трябва. Благодаря много, много | | pmarchovskiСъб, 07.04.18, 15:26 |
Имам само един последен въпрос. Възможно ли е, след като се въведе поръчката в първото поле (Textbox1), ако има някакви записи по тази поръчка те да се покажат в полетата. Така ще се вижда каква информация вече е вкарана по съответната поръчка :) | | drevenСъб, 07.04.18, 19:11 | RE: Въвеждане на данни в ексел с VBA UserForm
” Имам само един последен въпрос. Възможно ли е, след като се въведе поръчката в първото поле (Textbox1), ако има някакви записи по тази поръчка те да се покажат в полетата. Така ще се вижда каква информация вече е вкарана по съответната поръчка :) „ Първият закон на програмирането гласи - Всичко, което ти хрумне е възможно. За да се постигне желаната функционалност на събитието Keydown на първото поле добавяме няколко реда сорс. След въвеждане на номера на поръчката и натискане на ENTER или TAB се задейства процедурата за търсене и визуализиране на вече въведена информация. Ето как изглежда новия сорс на формата: Dim red, tablica
Private Sub CommandButton1_Click()
If Form1.TextBox1.Text = "" Then GoTo izhod
StaraPorachka
'''''''''Записваме подадената информация, само за попълнено текстово поле'''''''''
If Form1.TextBox1.Text <> "" Then tablica.Cells(red, 1) = Form1.TextBox1.Text
If Form1.TextBox2.Text <> "" Then tablica.Cells(red, 2) = Form1.TextBox2.Text
If Form1.TextBox3.Text <> "" Then tablica.Cells(red, 3) = Form1.TextBox3.Text
If Form1.TextBox4.Text <> "" Then tablica.Cells(red, 4) = Form1.TextBox4.Text
If Form1.TextBox5.Text <> "" Then tablica.Cells(red, 5) = Form1.TextBox5.Text
'Почистваме полетата за нова поръчка или запис
Form1.TextBox1.Text = "": Form1.TextBox2.Text = "": Form1.TextBox3.Text = ""
Form1.TextBox4.Text = "": Form1.TextBox5.Text = ""
Exit Sub
izhod: MsgBox "Не е посочена поръчка"
End Sub
Private Sub StaraPorachka()
Set tablica = Sheets("Data") ' Посочваме таблицата в която ще пишем
'''''''''''''''''''''''''ТЪРСИМ СТАРА ПОРЪЧКА'''''''''''''''''''''''''''''''
red = 0 'Нулираме брояча на редове
Do 'стартираме безкраен цикъл, защото не знаем броя на поръчките
red = red + 1
'Проверяваме за налична поръчка, за да определим реда, където да пишем
If tablica.Cells(red, 1) = "" Or tablica.Cells(red, 1) = Form1.TextBox1.Text Then
Exit Do
End If
Loop
End Sub
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 13 Or KeyCode = 9 Then 'При натискане на ENTER или TAB
StaraPorachka ' Определяме реда
'Показваме стара, записана вече информация за тази поръчка
Form1.TextBox2.Text = tablica.Cells(red, 2)
Form1.TextBox3.Text = tablica.Cells(red, 3)
Form1.TextBox4.Text = tablica.Cells(red, 4)
Form1.TextBox5.Text = tablica.Cells(red, 5)
End If
End Sub |
Ето го и новия работещ пример с допълнителната функционалност:Input_form.xls | | pmarchovskiПон, 09.04.18, 17:09 |
:) Ще запомня този закон. Страхотно се е получило. Още веднъж благодаря много. | | pmarchovskiПон, 09.04.18, 18:54 |
Нещо в настройките за датата ли бъркам, че като въведа в полето старт дата или крайна дата или дата за износ например 12/04/2018, в клетката в шиит Data излиза 04/12/2018. Разменя датата и месеца | | drevenПон, 09.04.18, 20:09 | RE: Въвеждане на данни в ексел с VBA UserForm
” Нещо в настройките за датата ли бъркам, че като въведа в полето старт дата или крайна дата или дата за износ например 12/04/2018, в клетката в шиит Data излиза 04/12/2018. Разменя датата и месеца „
За да не зависи от настройките, добавяме функция за форматиране на дата. При този вариант независимо какъв разделител използваш при въвеждане: 12/04/2018 или 12.04.2018 в таблицата ще ти ги записва правилно винаги в във вида 12.04.2018 Input_form.xlsЕто я промяната: '''''''''Записваме подадената информация, само за попълнено текстово поле'''''''''
If Form1.TextBox1.Text <> "" Then tablica.Cells(red, 1) = Form1.TextBox1.Text
If Form1.TextBox2.Text <> "" Then tablica.Cells(red, 2) = Format(Form1.TextBox2.Text, "dd/mm/yyyy")
If Form1.TextBox3.Text <> "" Then tablica.Cells(red, 3) = Format(Form1.TextBox3.Text, "dd/mm/yyyy")
If Form1.TextBox4.Text <> "" Then tablica.Cells(red, 4) = Form1.TextBox4.Text
If Form1.TextBox5.Text <> "" Then tablica.Cells(red, 5) = Format(Form1.TextBox5.Text, "dd/mm/yyyy") |
редактиран от dreven на 09.04.18 20:09 редактиран от dreven на 09.04.18 20:11 | | Коментар |