Добрый день! Есть мед клиника, штат врачей (часто изменяется). Написал макрос считающий зарплату врачей и формирующий отчет. Но ввиду постоянно изменяющегося штата врачей постоянно приходится допиливать макрос. Хотел бы услышать Ваши предложения, как этого можно избежать. Файл с макросом более 5 мб, прикрепить не могу. Вот сам макрос [vba]
Код
Private Sub CommandButton1_Click() Dim sdate As String Dim dodate As String Dim s As Single Dim d As Single Dim sym As Single Dim ms As String Dim d1 As String Dim d2 As String Dim d3 As String Dim d4 As String Dim d5 As String Dim d6 As String Dim sym2 As Single Dim sym3 As Single Dim sym4 As Single Dim minus As Single d1 = CStr(TextBox1.Text) d2 = CStr(TextBox2.Text) d3 = CStr(TextBox3.Text) sdate = d1 & "." & d2 & "." & d3 dodate = CStr(TextBox4.Text) & "." & CStr(TextBox5.Text) & "." & CStr(TextBox6.Text) For i = 4 To 65536 If CStr(Cells(i, 1)) = sdate Then s = i If CStr(Cells(i, 1)) = dodate Then d = i If s <> 0 And d <> 0 Then GoTo 10 Next 10 sym = 0 ms = "" For i = 2 To 32 For j = s To d sym = sym + CSng(Cells(j, i)) Next If Cells(3, i) = 1 Then minus = CSng(InputBox("Введите минуc по " & Cells(1, i))) sym2 = sym - minus minus = 0 sym2 = sym2 * CSng(Cells(2, i)) / 100 sym3 = sym3 + sym2 ms = ms & CStr(Cells(1, i)) & Space(15 - Len(Cells(1, i))) & vbTab & CStr(sym) & Space(8 - Len(CStr(sym))) & vbTab & CStr(sym2) & vbCrLf Cells(i - 1, 36) = Cells(1, i) Cells(i - 1, 37) = CSng(sym) Cells(i - 1, 38) = CSng(sym2) sym = 0 Next MsgBox (ms) Range(Cells(1, 34), Cells(32, 36)).Select Cells(31, 34) = "Зарплата всего" Cells(31, 36) = CSng(sym3) Cells(32, 34) = "Зарплата стоматологи" Cells(32, 36) = CSng(Cells(1, 36)) + CSng(Cells(2, 36)) + CSng(Cells(3, 36)) + CSng(Cells(4, 36)) + CSng(Cells(5, 36)) Selection.PrintOut Copies:=1, Collate:=True Selection.Clear UserForm1.Hide End Sub
[/vba] [moder]Код нужно оформлять тегами (кнопка #)! Поправила.[/moder]
Добрый день! Есть мед клиника, штат врачей (часто изменяется). Написал макрос считающий зарплату врачей и формирующий отчет. Но ввиду постоянно изменяющегося штата врачей постоянно приходится допиливать макрос. Хотел бы услышать Ваши предложения, как этого можно избежать. Файл с макросом более 5 мб, прикрепить не могу. Вот сам макрос [vba]
Код
Private Sub CommandButton1_Click() Dim sdate As String Dim dodate As String Dim s As Single Dim d As Single Dim sym As Single Dim ms As String Dim d1 As String Dim d2 As String Dim d3 As String Dim d4 As String Dim d5 As String Dim d6 As String Dim sym2 As Single Dim sym3 As Single Dim sym4 As Single Dim minus As Single d1 = CStr(TextBox1.Text) d2 = CStr(TextBox2.Text) d3 = CStr(TextBox3.Text) sdate = d1 & "." & d2 & "." & d3 dodate = CStr(TextBox4.Text) & "." & CStr(TextBox5.Text) & "." & CStr(TextBox6.Text) For i = 4 To 65536 If CStr(Cells(i, 1)) = sdate Then s = i If CStr(Cells(i, 1)) = dodate Then d = i If s <> 0 And d <> 0 Then GoTo 10 Next 10 sym = 0 ms = "" For i = 2 To 32 For j = s To d sym = sym + CSng(Cells(j, i)) Next If Cells(3, i) = 1 Then minus = CSng(InputBox("Введите минуc по " & Cells(1, i))) sym2 = sym - minus minus = 0 sym2 = sym2 * CSng(Cells(2, i)) / 100 sym3 = sym3 + sym2 ms = ms & CStr(Cells(1, i)) & Space(15 - Len(Cells(1, i))) & vbTab & CStr(sym) & Space(8 - Len(CStr(sym))) & vbTab & CStr(sym2) & vbCrLf Cells(i - 1, 36) = Cells(1, i) Cells(i - 1, 37) = CSng(sym) Cells(i - 1, 38) = CSng(sym2) sym = 0 Next MsgBox (ms) Range(Cells(1, 34), Cells(32, 36)).Select Cells(31, 34) = "Зарплата всего" Cells(31, 36) = CSng(sym3) Cells(32, 34) = "Зарплата стоматологи" Cells(32, 36) = CSng(Cells(1, 36)) + CSng(Cells(2, 36)) + CSng(Cells(3, 36)) + CSng(Cells(4, 36)) + CSng(Cells(5, 36)) Selection.PrintOut Copies:=1, Collate:=True Selection.Clear UserForm1.Hide End Sub
[/vba] [moder]Код нужно оформлять тегами (кнопка #)! Поправила.[/moder]IIOB
Сообщение отредактировал Manyasha - Вторник, 01.09.2015, 11:36
Отправил на почту, оставил по 3-4 строки, все равно 1.5мб весит [moder]файл прикладывать нужно сюда! Заархивируйте его и приложите к сообщению[/moder]
Отправил на почту, оставил по 3-4 строки, все равно 1.5мб весит [moder]файл прикладывать нужно сюда! Заархивируйте его и приложите к сообщению[/moder]IIOB
For i = 2 To 32 For j = s To d sym = sym + CSng(Cells(j, i)) Next If Cells(3, i) = 1 Then minus = CSng(InputBox("Введите минуc по " & Cells(1, i))) sym2 = sym - minus minus = 0 sym2 = sym2 * CSng(Cells(2, i)) / 100 sym3 = sym3 + sym2 ms = ms & CStr(Cells(1, i)) & Space(15 - Len(Cells(1, i))) & vbTab & CStr(sym) & Space(8 - Len(CStr(sym))) & vbTab & CStr(sym2) & vbCrLf Cells(i - 1, 36) = Cells(1, i) Cells(i - 1, 37) = CSng(sym) Cells(i - 1, 38) = CSng(sym2) sym = 0 Next
[/vba] так как количество столбцов изменяется при добавлении нового врача, то и первый цикл надо постоянно поправлять, а за ним и место для формирования шаблона для печати [vba]
For i = 2 To 32 For j = s To d sym = sym + CSng(Cells(j, i)) Next If Cells(3, i) = 1 Then minus = CSng(InputBox("Введите минуc по " & Cells(1, i))) sym2 = sym - minus minus = 0 sym2 = sym2 * CSng(Cells(2, i)) / 100 sym3 = sym3 + sym2 ms = ms & CStr(Cells(1, i)) & Space(15 - Len(Cells(1, i))) & vbTab & CStr(sym) & Space(8 - Len(CStr(sym))) & vbTab & CStr(sym2) & vbCrLf Cells(i - 1, 36) = Cells(1, i) Cells(i - 1, 37) = CSng(sym) Cells(i - 1, 38) = CSng(sym2) sym = 0 Next
[/vba] так как количество столбцов изменяется при добавлении нового врача, то и первый цикл надо постоянно поправлять, а за ним и место для формирования шаблона для печати [vba]
спасибо за быстрый ответ Еще вопрос, пользователь, который заполняет таблицу очень неграмотный и может случайно перетащить ячейку возможно сделать защиту от перетаскивания ячейки или случайного изменения данных в листе
Правки ШИКАРНЫ и элегантны, только касаемо столбца А он у меня в оригинале заполнен до конца датами (тут оставил свой вариант), по поводу проверки на 0 полностью согласен, проглядел( [moder]Про работу макроса при защите листа ищите в поиске. Таких тем много обсуждалось.[/moder]
спасибо за быстрый ответ Еще вопрос, пользователь, который заполняет таблицу очень неграмотный и может случайно перетащить ячейку возможно сделать защиту от перетаскивания ячейки или случайного изменения данных в листе
Правки ШИКАРНЫ и элегантны, только касаемо столбца А он у меня в оригинале заполнен до конца датами (тут оставил свой вариант), по поводу проверки на 0 полностью согласен, проглядел( [moder]Про работу макроса при защите листа ищите в поиске. Таких тем много обсуждалось.[/moder]IIOB
Сообщение отредактировал Manyasha - Вторник, 01.09.2015, 17:37