Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 21.04.2008, 13:14   #1
Flangini
Форумчанин
 
Аватар для Flangini
 
Регистрация: 11.02.2008
Сообщений: 119
По умолчанию Пользовательская форма к макросу

Добрый день, господа!!! (В Нижнем Новгороде сейчас день)
Не затруднит ли Вас помочь мне в одном маленьком но очень интересном (покрайне мере для меня) деле? А суть дела такова, есть мною написанный макрос (замечания по его написанию так же приветствуются):
Sub Печать()
Dim Data() As String
ReDim Data(300)
Dim x As Object
Dim i, j, z As Integer
On Error Resume Next

Set x = ActiveWorkbook.Sheets("Список")
Set x = Worksheets("Список")
x.Activate

z = 1
For i = 2 To 100
For j = 1 To 3
Data(z) = Cells(i, j).Value
z = z + 1
Next
Next

Set x = Worksheets("На средний конверт")
x.Activate

z = 1
For z = 1 To 9
Cells(18, 7).Value = Data(z)
z = z + 1
Cells(20, 7).Value = Data(z)
z = z + 1
Cells(24, 6).Value = Data(z)
ActiveWindow.SelectedSheets.PrintOu t Copies:=1, Collate:=True
Next

End Sub

Надеюсь не нужно описывать то что этот макрос выполняет

Подскажите пожалуста, как сделать форму чтобы в ней можно было задать кол-во печатей (как я для себя это понял, чтобы можно было вместо красной девятки указать любую другую цифру)
Зарание огромное Вам спасибо!!!
Flangini вне форума
Старый 21.04.2008, 14:48   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

1) Зачем Вы объявляете динамический массив? Можно сразу: Dim Data(300).
2) Объявление вида Dim i, j, z As Integer даст только z As Integer, все остальные переменные будут Variant. Нужно объявлять каждую.
3) Лучше не использовать лишние объекты и метод Activate.
4) Вместо строки For z = 1 To 9 можно вставить For i = 1 To InputBox("Введите количество", "Ввод").
5) Ну,и чуть оптимизировать метод PrintOut.
Получим, что-то вроде:
Код:
Sub Печать()
    Dim Data(300) As String, i As Integer, j As Integer, z As Integer
    On Error Resume Next
    
    With Sheets("Список")
        z = 1
        For i = 2 To 100
            For j = 1 To 3
                Data(z) = .Cells(i, j).Value
                z = z + 1
            Next
        Next
    End With
    
    With Sheets("На средний конверт")
        z = 1
        For i = 1 To InputBox("Введите количество", "Ввод")  'Если я правильно понял,
            .Cells(18, 7) = Data(z)                                       'то печатать нужно форму
            z = z + 1                                                         'с введенным количеством троек Z
            .Cells(20, 7) = Data(z)
            z = z + 1
            .Cells(24, 6) = Data(z)
            .PrintOut Copies:=1, Collate:=True
            z = z + 1
        Next
     End With
     
End Sub
Здесь никак не проверяется введенное пользователем значение. Если нужно - вставьте соответствующие Вашим требованиям условия.
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 21.04.2008 в 14:53.
SAS888 вне форума
Старый 21.04.2008, 15:20   #3
Flangini
Форумчанин
 
Аватар для Flangini
 
Регистрация: 11.02.2008
Сообщений: 119
По умолчанию

Огромное спасибо!!! Обязательно поправлю
А можно сделать возможность выбора "На средний конверт", "На большой конверт", "На маленький конверт"???
Flangini вне форума
Старый 21.04.2008, 15:26   #4
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Flangini, Вам нужна именно форма или любое текстовое поле, куда можно вводить значение? Чтобы вставить форму:
1) Вызовите редактор VBA (Alt+F11)
2) Insert > UserForm (Вставить > Пользовательская форма)
3) В появившейся панели инструментов (Toolbox) выберите TextBox (Поле ввода - третья слева иконка, в виде букв ab и курсора).
4) Щелкните мышкой в любом месте свежесозданной формы
5) В скрипт пишем:
Код:
z = 1
For z = 1 To CInt(TextBox1.Text)
Cells(18, 7).Value = Data(z)
z = z + 1
Cells(20, 7).Value = Data(z)
z = z + 1
Cells(24, 6).Value = Data(z)
ActiveWindow.SelectedSheets.PrintOut Copies:=1, Collate:=True
Next
Также можно задавать количество копий в любой ячейке на листе, либо в поле ввода, которое расположить не на форме, а прямо на листе.
По поводу выбора размера конверта:
Вставляем UserForm, туда добавляем 3 OptionButton'а и одну CommandButton - три переключателя и одну кнопочку. У каждого переглючателя свойство Name присваиваем соответственно bigenv, medenv и smallenv. У кнопки это же свойство ставим prinnt Пишем скрипт:
Код:
Private Sub prinnt_Click()
If bigenv.Value = True Then
'Действия для печати на большой конверт
End If
If medenv.Value = True Then
'Действия для печати на средний конверт
End If
If smallenv.Value = True Then
'Действия для печати на маленький конверт
End If
End Sub

Private Sub UserForm_Activate()
bigenv.Caption = "На большой конверт"
medenv.Caption = "На средний конверт"
smallenv.Caption = "На маленький конверт"
bigenv.GroupName = "envelope"
medenv.GroupName = "envelope"
smallenv.GroupName = "envelope"
bigenv.Value = True
medenv.Value = False
smallenv.Value = False
prinnt.Caption = "Печать"
UserForm2.Caption = "Какого размера конверт?"
End Sub

Последний раз редактировалось yourself; 21.04.2008 в 15:59. Причина: Дополнение
yourself вне форума
Старый 21.04.2008, 15:53   #5
Flangini
Форумчанин
 
Аватар для Flangini
 
Регистрация: 11.02.2008
Сообщений: 119
По умолчанию

С открытием в своей жизни вот этой строчки ''For i = 1 To InputBox("Введите количество", "Ввод")'' надобность в форме отпала
А можно ли при помощи оператора CASE сделать возможность выбора с какова листа печатать какую форму, что-то вроде такого

InputBox("Введите с какого листа печатать", "Выбор")''
CASE:
1: "На маленький конверт"
2: "На средний конверт"
3: "На большой конверт"

Поможите с синтаксисос?
Flangini вне форума
Старый 21.04.2008, 17:15   #6
yourself
Пользователь
 
Аватар для yourself
 
Регистрация: 10.11.2007
Сообщений: 38
По умолчанию

Синтаксис такой:
Код:
Private sub prinnt_click()
Select Case InputBox("С какого листа печатать? 1 - На маленький конверт, 2 - На средний конверт, 3 - На большой конверт", "Выбор")
Case 1
'Действия для печати на маленький конверт
Case 2
'Действия для печати на средний конверт
Case 3
'Действия для печати на большой конверт
Case Empty
'
Case Else
MsgBox ("Неверный ввод")
End Select
yourself вне форума
Старый 23.04.2008, 13:39   #7
Flangini
Форумчанин
 
Аватар для Flangini
 
Регистрация: 11.02.2008
Сообщений: 119
По умолчанию

Большое спасибо!!!
Flangini вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
форма blackstersl Мультимедиа в Delphi 1 23.08.2008 19:03
Форма Killbrum Помощь студентам 8 21.08.2008 18:48
Форма subsonic Общие вопросы Delphi 5 10.01.2008 11:18
форма... Briz Общие вопросы Delphi 8 22.10.2007 17:26
Форма MAcK Общие вопросы Delphi 4 07.02.2007 01:43