download.bg
 Вход Списание  Новини  Програми  Статии  Форум  Чат   Абонамент  Топ95   Архив 

Въвеждане на данни в ексел с VBA UserForm

< 1 2 >

Автор
Съобщение
pmarchovski
Пет, 06.04.18, 12:01
Здравейте,
Имам една екселска табличка, в която искам да въвеждаме малко данни. Прикачвам самата таблица. В нея има два шиита. В първия има бутон с който извиквам юзер формата. В нея има няколко полета, които се попълват. Във втория шиит е мястото в което се записва всичко от формата. Това което ми се иска да се случва е следното. Задължително да има поръчка. Ако поръчката вече съществува, остнаналите полета да се записват срещу нея. Ако няма такава поръчка да се записва на нов (последния ред) заедно с останалата информация.
Предварително благодаря за помоща.

Input_form.xlsx

pmarchovski
Пет, 06.04.18, 12:08
Пропуснах само да отбележа, че данните срещу всяка поръчка могат да се въвеждат в различни дни. Например днес въвеждам само началната дата. Утре само крайната и т.н. Това означава, че въведените вече данни трябва да си остават дори и полето във формата да е празно, а да се записват само тези, които са попълнени във формата.
naskobk
Пет, 06.04.18, 20:11
Според мен на теб ти трябва складова програма,
която работи под ексел, аз съм правил такива разработки на времето,
може да видиш видео презентация на складова програма под ексел
тук: http://infosoftbg.com/video.html

както и тук: https://www.download.bg/?cls=program&id=660965

                                                                                  Поздрави и весели празници

редактиран от 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

< 1 2 >

Коментар

за нас | за разработчици | за реклама | станете автори | in english  © 1998-2024   Experta Ltd.