Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Excel VBA (часть 2)

Автор: JKarel
Дата сообщения: 27.05.2008 20:59
Кто может подсказать? Как сделать так, чтобы защитить лист, а кнопочки чтобы работали?
Автор: harwid
Дата сообщения: 29.05.2008 12:03
Добрый день!
Есть лист, панель инструментов и две кнопки - "Печать" и "Печать листа". Данные на листе вида " Сотрудник - начислено - удержано - итого". Стоит задача при нажатии кнопки "Печать" - печатать на отдельном листке бумаги одну строчку для каждого сотрудника. Панель с кнопками я сделал при запуске книги. Дальше представляю себе только алгоритм: Пока строка содержит данные, задать область печати, печать. Перейти к следующей строке. Возможно ли такое организовать на VB? Форум перекопал, про печать не нашел ничего. Заранее спасибо за ответы!
Автор: Griven
Дата сообщения: 29.05.2008 15:14
Народ, подскажите как в буфер обмена скопировать значение переменной?
Автор: Vitus_Bering
Дата сообщения: 29.05.2008 15:55
Griven
См. здесь.
Автор: WowGun
Дата сообщения: 29.05.2008 16:03
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

только при БОЛЬШОМ количестве строк принтер МОЖЕТ захлебнуться ...
Автор: XXXXXXXXXXXXXXXX
Дата сообщения: 29.05.2008 22:37
Возникла такая проблема.
Существует лист-печатная форма в который с помощью макроса заносятся данные и он распечатывается. Так вот макрос у некоторых ячеек устанавливает свойство LineStyle и раньше все работало нормально, но после того как я переставил office с 2003 на 2007 (заставили) макрос больше не выполняется и вылетает вот с такой ошибкой:

Run-time error '1004'
Нельзя установить свойство LineStyle класса Border

и я с этим согласен так как при попытке вручную поставить тип границы в этих ячейках ничего не происходит, более того если попытаться вызвать из меню Формат ячеек..., то тоже никакой реакции.
Сразу оговорюсь, что никакой защиты на листе или на ячейках не стоит.

Ах да, я пытался открыть документ и выполнить этот макрос после этого на 2003 офисе, появляется та же ошибка.

Может кто-нибудь сталкивался с такой проблемой или есть какие-нибудь соображения на этот счет, поделитесь?
Автор: Griven
Дата сообщения: 30.05.2008 10:29
Vitus_Bering
Спасибо, помогло!
Автор: ValentinaK
Дата сообщения: 30.05.2008 12:07
Товарищи, помогите!!!как импортировать из файла Excell два определенных столбика в Spreadsheet который находитса в UserForm. ЖДУ................
Автор: WowGun
Дата сообщения: 30.05.2008 12:59
ValentinaK
а чего ЖДАТЬ ? тря... писАть надо ... )))


Sub wer()
UserForm1.Show
For i = 1 To 10
UserForm1.Spreadsheet1.Range("A" & i).Value = Range("A" & i).Value
Next
End Sub
Автор: DES user
Дата сообщения: 30.05.2008 14:55
Всем привет!
Посмотрите на следующий код где ошибка

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
Автор: WowGun
Дата сообщения: 30.05.2008 15:28
DES user
Sheet1 - НАЗВАНИЕ .... ЧЕГО? (эт Excel у Вас спрашивает ...)
наверное ОБЪЕКТА Sheets
т.е. должно быть где-то так ... Sheets("Sheet1").Cells(2, 2) = rs
Автор: DES user
Дата сообщения: 30.05.2008 15:59
WowGun
Sheet1 - это "безимянное" обращение к странице (непомню как это правильно называется). Т.е. если сделать Sheets(1).Cells(2, 2) = "123", то в ячейке В2 появится 123.
НО ошибочка всеже закралась, по запарке не поставил скобки.
Автор: nick7inc
Дата сообщения: 01.06.2008 14:33
DES user

Цитата:
НО ошибочка всеже закралась, по запарке не поставил скобки.

Может Sheet1 - внутреннее имя листа. Тогда нет ошибки.
Автор: DES_user
Дата сообщения: 01.06.2008 17:09
to nick7inc
Нет, новая книга, т.е. все названия станданртые.
Автор: Igory26
Дата сообщения: 01.06.2008 17:57
Всем привет.
В общем есть такая ситуация. Есть одна книга (назовем ее Книга 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
Автор: kalinakrasnay
Дата сообщения: 01.06.2008 21:32
Привет. Снова я явилась, не запылась. Оч. нужен совет...
Вот я программирую (генерация простого числа). код [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 кодом надо что-то намудрить...уже не знаю, что творить(
Автор: SAS888
Дата сообщения: 02.06.2008 05:43
kalinakrasnay
Если в процессе вычисления получаются большие числа, то можно в коде макроса преобразовывать формат в Decimal, делать все математические операции, затем, если нужно вывести это число в ячейку листа, то преобразовывать в текстовый формат.
Например:
Пусть даны переменные x и y. Сложить их можно так:


Код: z = CStr(CDec(x) + CDec(y))
Автор: kalinakrasnay
Дата сообщения: 02.06.2008 08:44
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.

Автор: SAS888
Дата сообщения: 02.06.2008 09:51
kalinakrasnay
А какая ошибка?
У Вас в коде функции и макроса вообще никак не объявляются переменные. Т.е. все имеют тип Variant. Можно объявить в функции переменную "rez As String", затем, первой же строкой вставить, например, x = CDec(rez), далее все по порядку (работать не с "rez", а с "x"), а при выходе из функции объявить "rez = CStr(x)".
В коде самого макроса везде, где Вы вызываете функцию "stepen", добавьте, например, CDec(stepen(2, b)). Т.е. т.к. результат функции может быть большим числом, то в самой функции работаем в формате данных Decimal, затем передаем макросу результат выполнения функции в формате String. А чтобы макросу далее работать, как с числом, снова преобразовываем в Decimal.
Автор: kalinakrasnay
Дата сообщения: 02.06.2008 10:16
SAS888, сделала вылетает все таже ошибка "overflow" при делении по mod. Я уже думаю сделать деление нацело отдельной функцией, ну поразрядно (как в школе в столбик делили и взять остаток), программу я написала, но возникает другая проблема

Цитата:
как надо переводить в 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.
Автор: SAS888
Дата сообщения: 02.06.2008 11:16
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
Автор: SamoylovA
Дата сообщения: 02.06.2008 12:26
Помогите пожалуйста, в ComboBox списоке необходимо вставить картинку после текста, возможно ли это?
Автор: MSM
Дата сообщения: 02.06.2008 13:04
Уважаемые подскажите как решить проблему.

При выделении строки програмно методом Range("23:23").Select выделяется
не только эта строка, но ещё все строки объединённой ячейки A22:B24.
Если тоже самое делать вручную, то выделяется только строка 23.

Как всёже програмно выделить только строку 23.

На числа внимания не обращайте - это так для примера.
Автор: kalinakrasnay
Дата сообщения: 02.06.2008 19:58
SAS888, вот... я тормоз. Как пример появился, так сразу получилось...
Спасибо большое!
Автор: The okk
Дата сообщения: 03.06.2008 07:07
SamoylovA

Цитата:
Помогите пожалуйста, в ComboBox списоке необходимо вставить картинку после текста, возможно ли это?

Есть вот такой контрол, но там картинка перед текстом. Не подойдет?:
http://www.codeproject.com/KB/combobox/ImageComboBoxControl.aspx
Автор: SamoylovA
Дата сообщения: 03.06.2008 08:48
The okk

Спасибо интересная ссылка. Еще такая проблемма создаю список на листе для заполнения ComboBox, в списке присутствуют символы из шрифта Symbol, символ крести, заполняю ComboBox, а при открытии списка отображается "§".


Автор: AlexeiKozlov
Дата сообщения: 03.06.2008 12:24
народ,а есть такой затык.
создан xlt .
его открывают из разных мест.
как бы организовать этот xlt,чтобы тот xls который созшдается из него,знал,откуда был запущен xlt?
Автор: ssa9999
Дата сообщения: 04.06.2008 07:21
он всегда знает. В свойствах документа написано, какой у него шаблон

доступ к этому свойству:
ActiveWorkbook.BuiltinDocumentProperties("Template")
Автор: SergBSI
Дата сообщения: 05.06.2008 09:58
подскажите нет ли где уже готового макроса создания предметного указателя в ворде
Автор: Igory26
Дата сообщения: 06.06.2008 07:38
Всем привет. Подскажите пожалуйста, почему не работает такая запись? Нужно из одной книги записать данные в другую книгу
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, истории становления российского интернета. Сделано для людей.