Кто может подсказать? Как сделать так, чтобы защитить лист, а кнопочки чтобы работали?
» Excel VBA (часть 2)
Добрый день!
Есть лист, панель инструментов и две кнопки - "Печать" и "Печать листа". Данные на листе вида " Сотрудник - начислено - удержано - итого". Стоит задача при нажатии кнопки "Печать" - печатать на отдельном листке бумаги одну строчку для каждого сотрудника. Панель с кнопками я сделал при запуске книги. Дальше представляю себе только алгоритм: Пока строка содержит данные, задать область печати, печать. Перейти к следующей строке. Возможно ли такое организовать на VB? Форум перекопал, про печать не нашел ничего. Заранее спасибо за ответы!
Есть лист, панель инструментов и две кнопки - "Печать" и "Печать листа". Данные на листе вида " Сотрудник - начислено - удержано - итого". Стоит задача при нажатии кнопки "Печать" - печатать на отдельном листке бумаги одну строчку для каждого сотрудника. Панель с кнопками я сделал при запуске книги. Дальше представляю себе только алгоритм: Пока строка содержит данные, задать область печати, печать. Перейти к следующей строке. Возможно ли такое организовать на VB? Форум перекопал, про печать не нашел ничего. Заранее спасибо за ответы!
Народ, подскажите как в буфер обмена скопировать значение переменной?
harwid
Допустим ДАННЫЕ в столбцах A, B, C, D и в строках со 2-й по 9-ю
Sub Макрос1()
For i = 2 To 9
Range("A" & i & ":D" & i).Select
Selection.PrintOut
Next
End Sub
только при БОЛЬШОМ количестве строк принтер МОЖЕТ захлебнуться ...
Допустим ДАННЫЕ в столбцах A, B, C, D и в строках со 2-й по 9-ю
Sub Макрос1()
For i = 2 To 9
Range("A" & i & ":D" & i).Select
Selection.PrintOut
Next
End Sub
только при БОЛЬШОМ количестве строк принтер МОЖЕТ захлебнуться ...
Возникла такая проблема.
Существует лист-печатная форма в который с помощью макроса заносятся данные и он распечатывается. Так вот макрос у некоторых ячеек устанавливает свойство LineStyle и раньше все работало нормально, но после того как я переставил office с 2003 на 2007 (заставили) макрос больше не выполняется и вылетает вот с такой ошибкой:
Run-time error '1004'
Нельзя установить свойство LineStyle класса Border
и я с этим согласен так как при попытке вручную поставить тип границы в этих ячейках ничего не происходит, более того если попытаться вызвать из меню Формат ячеек..., то тоже никакой реакции.
Сразу оговорюсь, что никакой защиты на листе или на ячейках не стоит.
Ах да, я пытался открыть документ и выполнить этот макрос после этого на 2003 офисе, появляется та же ошибка.
Может кто-нибудь сталкивался с такой проблемой или есть какие-нибудь соображения на этот счет, поделитесь?
Существует лист-печатная форма в который с помощью макроса заносятся данные и он распечатывается. Так вот макрос у некоторых ячеек устанавливает свойство LineStyle и раньше все работало нормально, но после того как я переставил office с 2003 на 2007 (заставили) макрос больше не выполняется и вылетает вот с такой ошибкой:
Run-time error '1004'
Нельзя установить свойство LineStyle класса Border
и я с этим согласен так как при попытке вручную поставить тип границы в этих ячейках ничего не происходит, более того если попытаться вызвать из меню Формат ячеек..., то тоже никакой реакции.
Сразу оговорюсь, что никакой защиты на листе или на ячейках не стоит.
Ах да, я пытался открыть документ и выполнить этот макрос после этого на 2003 офисе, появляется та же ошибка.
Может кто-нибудь сталкивался с такой проблемой или есть какие-нибудь соображения на этот счет, поделитесь?
Vitus_Bering
Спасибо, помогло!
Спасибо, помогло!
Товарищи, помогите!!!как импортировать из файла Excell два определенных столбика в Spreadsheet который находитса в UserForm. ЖДУ................
ValentinaK
а чего ЖДАТЬ ? тря... писАть надо ... )))
Sub wer()
UserForm1.Show
For i = 1 To 10
UserForm1.Spreadsheet1.Range("A" & i).Value = Range("A" & i).Value
Next
End Sub
а чего ЖДАТЬ ? тря... писАть надо ... )))
Sub wer()
UserForm1.Show
For i = 1 To 10
UserForm1.Spreadsheet1.Range("A" & i).Value = Range("A" & i).Value
Next
End Sub
Всем привет!
Посмотрите на следующий код где ошибка
Private Sub CommandButton1_Click()
Dim db As ADODB.Connection
Set db = New ADODB.Connection
db.Open ("Provider=OraOLEDB.Oracle;Data Source=DB;User Id=user;Password=pass;")
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.ActiveConnection = db
rs.Open "select sysdate from dual"
Sheet(1).Cells(2, 2) = rs ' здесь ругается error 424 Object required
rs.Close
db.Close
End Sub
к базе цепляется.
может как-то подругому выводить результаты запроса?
Нашел решение
выводить результаты нужно так:
Range("B3").CopyFromRecordset rs
Посмотрите на следующий код где ошибка
Private Sub CommandButton1_Click()
Dim db As ADODB.Connection
Set db = New ADODB.Connection
db.Open ("Provider=OraOLEDB.Oracle;Data Source=DB;User Id=user;Password=pass;")
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.ActiveConnection = db
rs.Open "select sysdate from dual"
Sheet(1).Cells(2, 2) = rs ' здесь ругается error 424 Object required
rs.Close
db.Close
End Sub
к базе цепляется.
может как-то подругому выводить результаты запроса?
Нашел решение
выводить результаты нужно так:
Range("B3").CopyFromRecordset rs
DES user
Sheet1 - НАЗВАНИЕ .... ЧЕГО? (эт Excel у Вас спрашивает ...)
наверное ОБЪЕКТА Sheets
т.е. должно быть где-то так ... Sheets("Sheet1").Cells(2, 2) = rs
Sheet1 - НАЗВАНИЕ .... ЧЕГО? (эт Excel у Вас спрашивает ...)
наверное ОБЪЕКТА Sheets
т.е. должно быть где-то так ... Sheets("Sheet1").Cells(2, 2) = rs
WowGun
Sheet1 - это "безимянное" обращение к странице (непомню как это правильно называется). Т.е. если сделать Sheets(1).Cells(2, 2) = "123", то в ячейке В2 появится 123.
НО ошибочка всеже закралась, по запарке не поставил скобки.
Sheet1 - это "безимянное" обращение к странице (непомню как это правильно называется). Т.е. если сделать Sheets(1).Cells(2, 2) = "123", то в ячейке В2 появится 123.
НО ошибочка всеже закралась, по запарке не поставил скобки.
DES user
Цитата:
Может Sheet1 - внутреннее имя листа. Тогда нет ошибки.
Цитата:
НО ошибочка всеже закралась, по запарке не поставил скобки.
Может Sheet1 - внутреннее имя листа. Тогда нет ошибки.
to nick7inc
Нет, новая книга, т.е. все названия станданртые.
Нет, новая книга, т.е. все названия станданртые.
Всем привет.
В общем есть такая ситуация. Есть одна книга (назовем ее Книга 1), на ней есть несколько листов (впринципе не важно сколько) и небольшая форма. На форме есть кнопка, несколько Textbox`ов и Combobox`ов. При нажатии на кнопку выполняется VBA код, который создает новую книгу с двумя листами, переименовывает листы, заполняет нужной информацией.
Если текст в одном из Combobox`ов и текст определенной ячейки на вновь созданном документе совпадает, то как сделать, чтобы при нажатии на кнопку новая книга не создавалась, а только заносилась информация в уже созданную книгу.
Private Sub CommandButton1_Click()
Module1.create_new_books ' создание новой книги
Module1.indiv_plan_table ' заполнение нужной инфомации
End Sub
Sub create_new_books()
Workbooks.Add
Sheets("Лист1").Select
Sheets("Лист1").Name = "Учебный план (лиц. сторона)"
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Лист2").Select
Sheets("Лист2").Name = "Учебный план (оборот. сторона)"
Sheets("Учебный план (лиц. сторона)").Select
End Sub
В общем есть такая ситуация. Есть одна книга (назовем ее Книга 1), на ней есть несколько листов (впринципе не важно сколько) и небольшая форма. На форме есть кнопка, несколько Textbox`ов и Combobox`ов. При нажатии на кнопку выполняется VBA код, который создает новую книгу с двумя листами, переименовывает листы, заполняет нужной информацией.
Если текст в одном из Combobox`ов и текст определенной ячейки на вновь созданном документе совпадает, то как сделать, чтобы при нажатии на кнопку новая книга не создавалась, а только заносилась информация в уже созданную книгу.
Private Sub CommandButton1_Click()
Module1.create_new_books ' создание новой книги
Module1.indiv_plan_table ' заполнение нужной инфомации
End Sub
Sub create_new_books()
Workbooks.Add
Sheets("Лист1").Select
Sheets("Лист1").Name = "Учебный план (лиц. сторона)"
Sheets.Add After:=Sheets(Sheets.Count)
Sheets("Лист2").Select
Sheets("Лист2").Name = "Учебный план (оборот. сторона)"
Sheets("Учебный план (лиц. сторона)").Select
End Sub
Привет. Снова я явилась, не запылась. Оч. нужен совет...
Вот я программирую (генерация простого числа). код [more=Здесь]
Function stepen(os, st)
rez = 1
If st = 0 Then
rez = 1
Else
For i = 1 To st
rez = rez * os
Next
End If
stepen = rez
End Function
Dim prostoe As Boolean
Dim p, b, a, m, z As Integer
Private Sub gen_Click()
prostoe = False
Do While Not prostoe
Randomize
p = Int(Rnd * 20) ' число, которое проверяется на простоту
'MsgBox (p)
'MsgBox (a)
kol = 0
b = 0 ' число делений р на 2
del = p - 1
Do While del >= 2 ' вычисление кол-ва делений р-1 на 2
If del Mod 2 = 0 Then
del = del / 2
b = b + 1
Else
Exit Do
End If
Loop
m = (p - 1) / stepen(2, b)
For i = 1 To 5
a = Int(Rnd * p) ' случайное число, меньше р
j = 0
z = (stepen(a, m)) Mod p
If (z = 1) Or (z = p - 1) Then
prostoe = True
Else
If (j > 0) Or (z = 1) Then prostoe = False
j = j + 1
Do While j <= b
If (j < b) And (z <> p - 1) Then
z = (stepen(stepen(a, m), 2)) Mod p
If z = p - 1 Then
prostoe = True
Exit Do
End If
End If
If (j = b) Or (z <> p - 1) Then prostoe = False
j = j + 1
Loop
End If
If prostoe Then kol = kol + 1
Next
If kol >= 3 Then
pr_4.Text = p
prostoe = True
End If
Loop
End Sub
[/more]
И вылетает ошибка "overflow"... на подсчете степени и на делении по mod, числа получаются большие, и я так понимаю они не влазают. Так как это можно обойти? Посоветуйте.
п.с. на код сильно не смотрите, это от нас так в универе требуют... (степень отдельной функцией)
п.п.с. мож тут с ACSII кодом надо что-то намудрить...уже не знаю, что творить(
Вот я программирую (генерация простого числа). код [more=Здесь]
Function stepen(os, st)
rez = 1
If st = 0 Then
rez = 1
Else
For i = 1 To st
rez = rez * os
Next
End If
stepen = rez
End Function
Dim prostoe As Boolean
Dim p, b, a, m, z As Integer
Private Sub gen_Click()
prostoe = False
Do While Not prostoe
Randomize
p = Int(Rnd * 20) ' число, которое проверяется на простоту
'MsgBox (p)
'MsgBox (a)
kol = 0
b = 0 ' число делений р на 2
del = p - 1
Do While del >= 2 ' вычисление кол-ва делений р-1 на 2
If del Mod 2 = 0 Then
del = del / 2
b = b + 1
Else
Exit Do
End If
Loop
m = (p - 1) / stepen(2, b)
For i = 1 To 5
a = Int(Rnd * p) ' случайное число, меньше р
j = 0
z = (stepen(a, m)) Mod p
If (z = 1) Or (z = p - 1) Then
prostoe = True
Else
If (j > 0) Or (z = 1) Then prostoe = False
j = j + 1
Do While j <= b
If (j < b) And (z <> p - 1) Then
z = (stepen(stepen(a, m), 2)) Mod p
If z = p - 1 Then
prostoe = True
Exit Do
End If
End If
If (j = b) Or (z <> p - 1) Then prostoe = False
j = j + 1
Loop
End If
If prostoe Then kol = kol + 1
Next
If kol >= 3 Then
pr_4.Text = p
prostoe = True
End If
Loop
End Sub
[/more]
И вылетает ошибка "overflow"... на подсчете степени и на делении по mod, числа получаются большие, и я так понимаю они не влазают. Так как это можно обойти? Посоветуйте.
п.с. на код сильно не смотрите, это от нас так в универе требуют... (степень отдельной функцией)
п.п.с. мож тут с ACSII кодом надо что-то намудрить...уже не знаю, что творить(
kalinakrasnay
Если в процессе вычисления получаются большие числа, то можно в коде макроса преобразовывать формат в Decimal, делать все математические операции, затем, если нужно вывести это число в ячейку листа, то преобразовывать в текстовый формат.
Например:
Пусть даны переменные x и y. Сложить их можно так:
Код: z = CStr(CDec(x) + CDec(y))
Если в процессе вычисления получаются большие числа, то можно в коде макроса преобразовывать формат в Decimal, делать все математические операции, затем, если нужно вывести это число в ячейку листа, то преобразовывать в текстовый формат.
Например:
Пусть даны переменные x и y. Сложить их можно так:
Код: z = CStr(CDec(x) + CDec(y))
SAS888, спасибо. Теперь вроде при возведении в степень ошибки не вылазиет, по при делении по mod по-прежнему вылазиет ошибка (я проверяла, уберу деление, все работает без ошибки)...
Может я где ошибаюсь, и не туда вставляю преобразование CDec. Подскажите пожалуйста, вот именно для этих строк:
m = (p - 1) / stepen(2, b)
z = stepen(a, m) Mod p
z = (stepen(stepen(a, m), 2)) Mod p
Добавлено
ALL,
еще вопросик: как надо переводить в string, например вот такое число 1,1Е+10??? Чтобы после перевода в строке оказалось число нормального вида, без E.
Может я где ошибаюсь, и не туда вставляю преобразование CDec. Подскажите пожалуйста, вот именно для этих строк:
m = (p - 1) / stepen(2, b)
z = stepen(a, m) Mod p
z = (stepen(stepen(a, m), 2)) Mod p
Добавлено
ALL,
еще вопросик: как надо переводить в string, например вот такое число 1,1Е+10??? Чтобы после перевода в строке оказалось число нормального вида, без E.
kalinakrasnay
А какая ошибка?
У Вас в коде функции и макроса вообще никак не объявляются переменные. Т.е. все имеют тип Variant. Можно объявить в функции переменную "rez As String", затем, первой же строкой вставить, например, x = CDec(rez), далее все по порядку (работать не с "rez", а с "x"), а при выходе из функции объявить "rez = CStr(x)".
В коде самого макроса везде, где Вы вызываете функцию "stepen", добавьте, например, CDec(stepen(2, b)). Т.е. т.к. результат функции может быть большим числом, то в самой функции работаем в формате данных Decimal, затем передаем макросу результат выполнения функции в формате String. А чтобы макросу далее работать, как с числом, снова преобразовываем в Decimal.
А какая ошибка?
У Вас в коде функции и макроса вообще никак не объявляются переменные. Т.е. все имеют тип Variant. Можно объявить в функции переменную "rez As String", затем, первой же строкой вставить, например, x = CDec(rez), далее все по порядку (работать не с "rez", а с "x"), а при выходе из функции объявить "rez = CStr(x)".
В коде самого макроса везде, где Вы вызываете функцию "stepen", добавьте, например, CDec(stepen(2, b)). Т.е. т.к. результат функции может быть большим числом, то в самой функции работаем в формате данных Decimal, затем передаем макросу результат выполнения функции в формате String. А чтобы макросу далее работать, как с числом, снова преобразовываем в Decimal.
SAS888, сделала вылетает все таже ошибка "overflow" при делении по mod. Я уже думаю сделать деление нацело отдельной функцией, ну поразрядно (как в школе в столбик делили и взять остаток), программу я написала, но возникает другая проблема
Цитата:
Код [more=тут]Function razdelit(slovo1, slovo2)
osn = 10
chast = ""
zn = True
If slovo1 < slovo2 Then
ost = slovo1
Else
tdelit = slovo2
i = Len(tdelit) + 1
delim = Mid(CStr(CDec(slovo1)), 1, Len(tdelit))
'MsgBox (CStr(CDec((slovo1))))
Do While i <= Len(slovo1)
If tdelit > delim Then
delim = delim & Mid(CStr(CDec(slovo1)), i, 1)
chast = chast & "0"
i = i + 1
zn = False
End If
If zn Then i = i + 1
zn = True
kch = delim \ tdelit
Do While kch * CDec(tdelit) > delim
kch = kch - 1
Loop
k = i
chast = CDec(chast & CStr(kch))
ost = CDec(delim) - kch * CDec(tdelit)
If ost = 0 Then k = i - 1
delim = CStr(ost) & Mid(slovo1, k, 1)
Loop
razdelit = ost
End If
End Function[/more]
В этой проге или я некорректно пишу или vba не так переводит большие числа (с E) в string.
Цитата:
как надо переводить в string, например вот такое число 1,1Е+10??? Чтобы после перевода в строке оказалось число нормального вида, без E.
Код [more=тут]Function razdelit(slovo1, slovo2)
osn = 10
chast = ""
zn = True
If slovo1 < slovo2 Then
ost = slovo1
Else
tdelit = slovo2
i = Len(tdelit) + 1
delim = Mid(CStr(CDec(slovo1)), 1, Len(tdelit))
'MsgBox (CStr(CDec((slovo1))))
Do While i <= Len(slovo1)
If tdelit > delim Then
delim = delim & Mid(CStr(CDec(slovo1)), i, 1)
chast = chast & "0"
i = i + 1
zn = False
End If
If zn Then i = i + 1
zn = True
kch = delim \ tdelit
Do While kch * CDec(tdelit) > delim
kch = kch - 1
Loop
k = i
chast = CDec(chast & CStr(kch))
ost = CDec(delim) - kch * CDec(tdelit)
If ost = 0 Then k = i - 1
delim = CStr(ost) & Mid(slovo1, k, 1)
Loop
razdelit = ost
End If
End Function[/more]
В этой проге или я некорректно пишу или vba не так переводит большие числа (с E) в string.
kalinakrasnay
Я же оговорил, что все данные объявлять как String, а все математические операции делать в Decimal.
Посмотрите, для примера, сложение двух 27-разрядных чисел:
Код: Sub SumDec()
'Объявление переменных
Dim x As String, y As String, z As String
'Присвоение значений переменным
x = "123456789012345678901234567" ' Текст
y = "123456789012345678901234567" ' Текст
'Сложение в формате Decimal и преобразование результата в текст
z = CStr(CDec(x) + CDec(y))
'Вывод результата
MsgBox z ' Текст
End Sub
Я же оговорил, что все данные объявлять как String, а все математические операции делать в Decimal.
Посмотрите, для примера, сложение двух 27-разрядных чисел:
Код: Sub SumDec()
'Объявление переменных
Dim x As String, y As String, z As String
'Присвоение значений переменным
x = "123456789012345678901234567" ' Текст
y = "123456789012345678901234567" ' Текст
'Сложение в формате Decimal и преобразование результата в текст
z = CStr(CDec(x) + CDec(y))
'Вывод результата
MsgBox z ' Текст
End Sub
Помогите пожалуйста, в ComboBox списоке необходимо вставить картинку после текста, возможно ли это?
Уважаемые подскажите как решить проблему.
При выделении строки програмно методом Range("23:23").Select выделяется
не только эта строка, но ещё все строки объединённой ячейки A22:B24.
Если тоже самое делать вручную, то выделяется только строка 23.
Как всёже програмно выделить только строку 23.
На числа внимания не обращайте - это так для примера.
При выделении строки програмно методом Range("23:23").Select выделяется
не только эта строка, но ещё все строки объединённой ячейки A22:B24.
Если тоже самое делать вручную, то выделяется только строка 23.
Как всёже програмно выделить только строку 23.
На числа внимания не обращайте - это так для примера.
SAS888, вот... я тормоз. Как пример появился, так сразу получилось...
Спасибо большое!
Спасибо большое!
SamoylovA
Цитата:
Есть вот такой контрол, но там картинка перед текстом. Не подойдет?:
http://www.codeproject.com/KB/combobox/ImageComboBoxControl.aspx
Цитата:
Помогите пожалуйста, в ComboBox списоке необходимо вставить картинку после текста, возможно ли это?
Есть вот такой контрол, но там картинка перед текстом. Не подойдет?:
http://www.codeproject.com/KB/combobox/ImageComboBoxControl.aspx
The okk
Спасибо интересная ссылка. Еще такая проблемма создаю список на листе для заполнения ComboBox, в списке присутствуют символы из шрифта Symbol, символ крести, заполняю ComboBox, а при открытии списка отображается "§".
Спасибо интересная ссылка. Еще такая проблемма создаю список на листе для заполнения ComboBox, в списке присутствуют символы из шрифта Symbol, символ крести, заполняю ComboBox, а при открытии списка отображается "§".
народ,а есть такой затык.
создан xlt .
его открывают из разных мест.
как бы организовать этот xlt,чтобы тот xls который созшдается из него,знал,откуда был запущен xlt?
создан xlt .
его открывают из разных мест.
как бы организовать этот xlt,чтобы тот xls который созшдается из него,знал,откуда был запущен xlt?
он всегда знает. В свойствах документа написано, какой у него шаблон
доступ к этому свойству:
ActiveWorkbook.BuiltinDocumentProperties("Template")
доступ к этому свойству:
ActiveWorkbook.BuiltinDocumentProperties("Template")
подскажите нет ли где уже готового макроса создания предметного указателя в ворде
Всем привет. Подскажите пожалуйста, почему не работает такая запись? Нужно из одной книги записать данные в другую книгу
Workbooks("Книга1").Worksheets("Лист1").Cells(1, 1).FormulaR1C1 = Workbooks("Книга2").Worksheets("Лист2").Cells(1, 1).Value
Workbooks("Книга1").Worksheets("Лист1").Cells(1, 1).FormulaR1C1 = Workbooks("Книга2").Worksheets("Лист2").Cells(1, 1).Value
Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
Предыдущая тема: Написание своего HyperTerminal для считывания данных
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.