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

» Excel VBA (часть 2)

Автор: SAS888
Дата сообщения: 15.12.2007 12:40
toNk
Может быть Вам будет полезно:
Для защиты рабочего листа я использую код: ActiveSheet.Protect Scenarios:=True, UserInterfaceOnly:=True
Это позволит макросам вносить изменения в защищенные ячейки, а пользователю - нет. И не нужно каждый раз снимать и ставить защиту. Необходимо, также иметь ввиду, что такой способ защиты не сохраняется вместе с рабочей книгой. Его нужно повторять каждый раз при открытии.
Автор: volidol1
Дата сообщения: 16.12.2007 10:00

Цитата:
у меня получается только защита без пароля

Можно так:
Private Sub Workbook_Open()
Dim MyPassWord As String
MyPassWord = "12345"
ThisWorkbook.Unprotect (MyPassWord)
ActiveSheet.Protect Password:=MyPassWord, UserInterfaceOnly:=True, DrawingObjects:=True, Contents:=True, Scenarios:=True
ThisWorkbook.Protect Password:=MyPassWord, Structure:=True, Windows:=False
End Sub
Автор: Samsobi
Дата сообщения: 18.12.2007 09:06
2ALL
Что то затупил я! Не помню после чего, вдруг стала видимой personal.xls. Все макросы работают нормально, но раздражает само появление personal.xls. Как вернуть невидимость ей?
Автор: SAS888
Дата сообщения: 18.12.2007 09:21
Попробуй войти В VBE, и в свойствах книги установи параметр IsAddin = True.
Автор: Samsobi
Дата сообщения: 18.12.2007 09:40
SAS888
Спасибо доктор - рецепт помог!
ЗЫ. Самое смешное, что порывшись в архивах вытащил свой старый personal.xls - там стоит False, но он все-таки невидим. Помню что - то не так, а не вспомню 8-(( Проклятый склероз, буду репу дальше чесать. Но все равно спасибо.
Автор: toNk
Дата сообщения: 18.12.2007 10:02
volidol1
Спасибо!!
Автор: masterNike
Дата сообщения: 20.12.2007 12:38
Есть вот такой цикл в макросе Excel (отрывок из него). Из SQL зачитываются записи на страницу в Excel с названием RawData. Как это происходит неважно. Затем макрос берет все строки из Rawdata и вставляет их на страницу Layout. Если i=150, то все записи вставляются попорядку, пока не закчнчивается лист, потом переход на другой лист и дальше вставка и т.д. Нужно сделать так, что бы на каждую страницу Layout выводилось только по 30 записей,а следующие 30 уже добавлялись на следующую страницу.

Sub OnRefreshAfterReports()
Dim i As Integer
Dim RowsCount As Integer
RowsCount = ThisWorkbook.Names("Report1.Range").RefersToRange.Rows.Count

For i = 1 To RowsCount
Sheets("Layout").Range("A" + CStr(i + 37)).Value = Sheets("RawData").Range("A" + CStr(i))
Next

Как это сделать???
Автор: Chim701
Дата сообщения: 20.12.2007 14:59
Кто знает - подскажите пожалуйста неопытному.. Мне нужно что бы файл отправлялся через электронную почту по нужному адресу взятому из адресной книге оутлук-экспресса. Единственное чего мне удалось добиться это появления окна "отправить" с пристегнутым нужным файлом:

ActiveDocument.SendMail

но при этом приходится ручками выбирать нужный адрес и ручками жать кнопку отправить. А можно все это автоматизировать с помощью VBA?
Автор: derf4
Дата сообщения: 20.12.2007 18:56
Очень нужна помощь в одном маленьком макросе, так как VBA не шарю.
Мне необходимо выделить диапазон с A1 по A(x), значение «x» хранится в ячейке P1
Очень буду признателен за помощь
Автор: SERGE_BLIZNUK
Дата сообщения: 20.12.2007 21:46
derf4
приблизительно так:
dim p1 as Long
p1 = Cells(1,"P").Value
Range(Cells(1, "A"), Cells(p1, "A")).Select
' Selection.Copy

Автор: AndVGri
Дата сообщения: 21.12.2007 07:30
masterNike


Цитата:
Затем макрос берет все строки из Rawdata и вставляет их на страницу Layout. Если i=150, то все записи вставляются попорядку, пока не закчнчивается лист, потом переход на другой лист
Какой лист заканчивается?

Цитата:
Нужно сделать так, что бы на каждую страницу Layout
А как можно сделать в рабочей книге несколько листов с одним именем layout?

Короче, набор процедур, для копирования произвольной таблицы, имеющей заголовок, заданным количеством строк на вновь создаваемые рабочие листы
[more]

Код:
Option Explicit

'Копирование заголовка таблицы
Private Sub CopyHead(ByVal headRange As Range, ByVal toSheet As Worksheet)
toSheet.Range(toSheet.Cells(1&, 1&), _
toSheet.Cells(headRange.Rows.Count, _
headRange.Columns.Count)).Value = headRange.Value
End Sub
'копирование таблицы листа sourceSheet числом строк RowCount
'на вновь создаваемые рабочие листы листы
Private Sub MakeSubLists(ByVal sourceSheet As Worksheet, ByVal RowCount As Long)
Dim iRow As Long, headRange As Range, toSheet As Worksheet
Dim firstRow As Long, lastRow As Long
Dim firstCol As Long, lastCol As Long
Dim vRows As Long, vCols As Long

firstRow = sourceSheet.UsedRange.Row
vRows = sourceSheet.UsedRange.Rows.Count
lastRow = vRows + firstRow - 1&
firstCol = sourceSheet.UsedRange.Column
vCols = sourceSheet.UsedRange.Columns.Count
lastCol = vCols + firstCol - 1&

Set headRange = sourceSheet.Range(sourceSheet.Cells(firstRow, firstCol), _
sourceSheet.Cells(firstRow, lastCol))

iRow = firstRow + 1&: vRows = RowCount
Do Until iRow > lastRow
Set toSheet = Worksheets.Add
CopyHead headRange, toSheet

If (iRow + RowCount - 1&) >= lastRow Then vRows = lastRow - iRow + 1&
toSheet.Range(toSheet.Cells(2&, 1&), toSheet.Cells(vRows + 1&, vCols)).Value = _
sourceSheet.Range(sourceSheet.Cells(iRow, firstCol), _
sourceSheet.Cells(iRow + vRows - 1&, lastCol)).Value
iRow = iRow + RowCount
Loop
End Sub

Public Sub test()
MakeSubLists ActiveSheet, 3
End Sub
Автор: derf4
Дата сообщения: 21.12.2007 11:51
2 SERGE_BLIZNUK Спасибо большое!!!
Автор: hackman
Дата сообщения: 24.12.2007 12:25
Ребята подскажите как удалить все присвоеные имя ячеек зразу?
Автор: SERGE_BLIZNUK
Дата сообщения: 24.12.2007 13:22
hackman
вот решение отсюда - http://www.planetaexcel.ru/forum.php?thread_id=1660
(с) мимоидущий

Код:
For Each Nm In ActiveWorkbook.Names
Nm.Delete
Next
Автор: nick7inc
Дата сообщения: 25.12.2007 10:30
SAS888

Цитата:
Для защиты рабочего листа я использую код:
SomeSheet.Protect Scenarios:=True, UserInterfaceOnly:=True
Это позволит макросам вносить изменения в защищенные ячейки, а пользователю - нет.



Спасибо за полезный код, но на моём Office 2000 заметил с ним глюк. Не уверен в том, что он проявляется именно при этих обстоятельствах, но всё же: если книга была сохранена с подобной настройкой, то при следующей её загрузке код не работает правильно, то есть, ячейки сами собой разблокируются а сам код игнорируется. Макрос стоит в WorkBook.Open(). Помогает только разблокировка перед блокировкой:
SomeSheet.Unprotect
SomeSheet.Protect Scenarios:=True, UserInterfaceOnly:=True
Автор: SAS888
Дата сообщения: 25.12.2007 11:27
nick7inc
Да, так и надо. Не знаю, глюк это или нет, но так происходит и в 2000, и в 2002, и в 2003 Office. Корректнее, если SomeSheet.Unprotect выполнять по событию Workbook_BeforeClose(Cancel As Boolean). Т. к в иначе рабочая книга хранится в "испорченном" виде, т .е. в меню защита как бы установлена, а на самом деле ее нет.
Автор: nick7inc
Дата сообщения: 25.12.2007 16:19

Цитата:
Корректнее, если SomeSheet.Unprotect выполнять по событию Workbook_BeforeClose(Cancel As Boolean)

Можно, я и сам думал, но здесь есть одна засада, если записывать с отключением макросов, то получем "испорченную книгу". Потом не хочется вносить изменения в книгу, если не всегда сохраняешься при выходе. IMHO проще эти 2 команды включить в WorkBook.Open().
Автор: SAS888
Дата сообщения: 26.12.2007 08:28
nick7inc
Как Вам угодно. Только причем здесь "сохранение"? Я о событии "закрытие".
Автор: nick7inc
Дата сообщения: 26.12.2007 10:58
Интересуют некоторые моменты про объекты VBA.
Нужно ли их после использования удалять, присваивая Nothing?
Пример:

Код:
Dim r as Range, r2 as Range
set r=ActiveSheet.cells(1,"A")
set r2=Range(cells(5,"A"),cells(10,"C"))
...
set r2=Nothing
set r=Nothing

Автор: SAS888
Дата сообщения: 26.12.2007 11:38
Присваивание использованным объектам значения "Nothing" - это просто "правила хорошего тона".
Автор: SERGE_BLIZNUK
Дата сообщения: 26.12.2007 12:49
SAS888

Цитата:
Присваивание использованным объектам значения "Nothing" - это просто "правила хорошего тона".

не всегда ;-)))
имхо, если используется объект OLE автоматизации (помнится тут на форуме были подобные вопросы с решением их) - ну, например, создаётся документ Word, то использование присовения null ("Nothing") - обязательно... ;-)))
Автор: nick7inc
Дата сообщения: 26.12.2007 13:32
SERGE_BLIZNUK
Есть ещё один момент: когда выделяешь ресурсы где-то снаружи VBA, то отсутствие своевременного их высвобождения приводит к печальным результатам. Это может случиться, если Excel, к примеру, остановит выполнение макроса из-за редактирования кода.

Добавлено:
Жаль, что нет там аналога C++ onExit(), или я не прав?
Автор: MEDBEDb GRIzzLY
Дата сообщения: 27.12.2007 06:44
Доброго времени суток!

Вопрос такой, у меня есть 3 комбобокса на страничке, значения их подгружаются с БД MS SQL, вроде все как хорошо, но почему начал глючить отображение значений в комбобоксе, вместо значения выползают вопросики типа "????? ?? ??", причем только когда уже выбрал.
Где собака зарыта?

Автор: vidicon
Дата сообщения: 29.12.2007 12:39
Так подскажите где скачать этот замечательный файл "PLEX для Microsoft Excel"???
Автор: toNk
Дата сообщения: 29.12.2007 12:58
Господа, с наступающим!

Подскажите, пожалуйста, как решить такую задачку.
В книге есть объект (кнопка), на которую завязан макрос из этой книги. При копировании в другую книгу (где есть такой же макрос), на кнопке остается ссылка на макрос в первой книге. Приходится вручную исправлять. Но таких кнопок - сотни. Как автоматизировать процесс?
Может быть, в Excele есть настрока, отменяющая сохранение ссылок на книгу, из которой копируется объект или ячейка?
Если нет, полагаю вопрос решается макросом, который тупо берет каждый объект в книге (кроме кнопок других объектов нет) и присваивает какое-то финсированное имя макроса (в идеале, конечно, удаляет название первой книги из ссфлки на макрос).
Заранее спасибо!


vidicon
http://www.planetaexcel.ru/
Автор: vidicon
Дата сообщения: 29.12.2007 17:07
toNk
спасибо конечно за сайт, но я просил рабочею, а не демку.
Автор: kalinakrasnay
Дата сообщения: 30.12.2007 14:21
Здравствуйте! У меня такая история:
есть форма в экселе, на ней кнопка создать, и по нажатию на нее должен создаться файл Word, но не на основе шаблона normal.dot а на основе моего (который лежит в той же папке, что и файл экселя), затем файл ворд должен сохранятся с заданным пользователем именем.
я добилась только чтоб показывался нужный диалог (создание нового документа ворд):

Цитата:
Private Sub sozd_Click()
Dim dia As Word.Dialog
Dim wod As Word.Application
Set wod = New Word.Application
Set dia = wod.Dialogs(wdDialogFileNew)
dia.Show
End Sub

а как связать его с моим шаблоном, присвоить имя не знаю. еще фокус в том, что сам шаблон открывать нельзя (как и созданный документ), т.к. у него там записаны на выполнение макросы при открытии и закрытии.
Короче надо чтоб пользователь просто задал имя файла ворд, он создался на основе моего личного шаблона и сохранился в нужную папку.
ОЙ, как я путанно написала! надеюсь на помощь!!! спасибо.
p.s. С наступающим НГ!
Автор: kalinakrasnay
Дата сообщения: 30.12.2007 22:54
И еще один вопросик:
вот есть функции поиска подстроки в строке, ну я делаю этот поиск в строке фамилий, написанных ч/з "/", нашла нужную и мне надо ее удалить из строки, как это сделать?? проблема именно с удалением...как это осуществить?
Автор: AndVGri
Дата сообщения: 31.12.2007 01:58
kalinakrasnay

Цитата:
а на основе моего (который лежит в той же папке, что и файл экселя)


Код:
Public Sub NewDocByTemplate()
Dim wrd As New Word.Application

wrd.Documents.Add ThisWorkbook.Path & "\myTemplate.dot"
wrd.Visible = True
End Sub
Автор: kalinakrasnay
Дата сообщения: 31.12.2007 10:25
AndVGri

Цитата:
Используй VBA.Replace

спасибо! отличная функция!

Цитата:
wrd.Documents.Add ThisWorkbook.Path & "\myTemplate.dot"

спасибо !!! теперь создаются документы на основе моего шаблона, а можно ли сделать так,чтоб файл создавался прозрачно для пользователя?
а то у меня создается на основе шаблона файл, грубо говоря открывается шаблон, я нажимаю сохранить, ну задаю имя и теперь это уже документ ворд, а в него из шаблона переписались макросы (они мне нужны) и при закрытии начинают работать(там один записан на это событие)! и выдаются ошибки всякие...короче нужно чтоб при закрытии? именно при 1-ом сохранении макросы не срабатывали. как сделать?

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

Предыдущая тема: Написание своего HyperTerminal для считывания данных


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.