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

» Excel VBA (часть 2)

Автор: ol7ca
Дата сообщения: 17.03.2008 22:51
SAS888


Цитата:
почему-то мой код не видит цвет (цифры видит). хотя до этого такой же вариант работал.


я нашел причину:
For i = 1 To .UsedRange.Rows.Count
Автор: SAS888
Дата сообщения: 18.03.2008 05:02
ol7ca
Ясно. Но это не совсем корректно, т.к.
Цитата:
.UsedRange.Rows.Count

вернет количество используемых строк на листе. Так, например, если используются строки с 15 по 20, получим 6. И тогода Ваш цикл будет обрабатывать строки с 1 по 6 (вообще мимо используемого диапазона).
Строка кода
Цитата:
.Cells(65536, 28).End(xlUp).Row
вернет номер последней строки в 28 столбце. А если нужна последняя используемая строка на листе, то истинный результат можно получить, используя

Код: For i = 1 To .Cells.SpecialCells(xlCellTypeLastCell).Row
Автор: DocBeen
Дата сообщения: 18.03.2008 13:40
Ребята подскажите мне, может я и не прав.
Для того чтоб создать собственную надстройку с пользовательскими макросами достаточно переименовать книгу из xls в xla

Поправьте если не ошибаюсь,
после этой операции у меня выходит ошибка о том что данный файл не является Надстройкой...
Автор: Wukuze
Дата сообщения: 18.03.2008 14:04
прошу помощи, вот кусок кода
Dim q As Long
Dim t As Long
t = 2
q = 2
Do
For q = 2 To 56890
If Worksheets(1).Cells(5, t) = Worksheets(3).Cells(2, q) Then Rows(q).Delete Shift:=xlUp
Next
t = t + 1
Loop Until t <> 65536

выдает 1004 ошибку
application defined or object defined error
значение q = 257 грешу на то что q однобайтовая переменная, но ведь вроде задал что dim q as Long , то есть четырех байтовая если не ошибаюсь. В чем тогда может быть причина?
Автор: nick7inc
Дата сообщения: 18.03.2008 15:04
DocBeen

Цитата:
Для того чтоб создать собственную надстройку с пользовательскими макросами достаточно переименовать книгу из xls в xla

Нет, надо "Сохранить как" и выбрать формат XLA. В действительности, в свойствах книги ставится специальная "галочка", сигнализирующая о том, что это AddIn. Можно средствами VBA её снять для того, чтобы, например, вернуть исходный XLS-файл в случае его утраты.

Добавлено:
А как вы будете эти макросы вызывать?

Добавлено:
Wukuze

Цитата:
прошу помощи, вот кусок кода

1) А вы не выскакиваете за допустимое количество строк/столбцов? Если мне не изменяет память, то максимально возможное кол-во столбцов в Excel 2000 составляет около 256.
2) Разумнее не сканировать все ячейки листа, а определять используемый диапазон.

Добавлено:
Вот 2 способа определения этого диапазона. Первый - для активной книги и листа, второй - с указанием конкретной книги и листа.
Код:
Sub ttt()

Debug.Print Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print Cells.SpecialCells(xlCellTypeLastCell).Column

Debug.Print Workbooks("Книга1").Sheets("Лист1").Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print Workbooks("Книга1").Sheets("Лист1").Cells.SpecialCells(xlCellTypeLastCell).Column


End Sub
Автор: Wukuze
Дата сообщения: 18.03.2008 15:35
nick7inc
точно не выскакиваю, потому как у меня в таблице 65535 строк, если я не ошибаюсь то моя переменная q определяет именно количество строк. Excel 2003 и там уже количество строк/ столбцов 65535. Но благодарю вас за попытку.

Добавлено:
nick7inc
определять используемый диапазон в данном случае не разумнее, так как моя задача сравнить разноформатные базы и найти в них отсутствующие элементы, так что перебор мне кажется более логичным.
Автор: DocBeen
Дата сообщения: 18.03.2008 15:39
nick7inc
Блин а я то почему то думал что из надстройки можно записанные макросы каким либо образом вызывать... обидно что не работает.
Вопрос тогда, а как можно тогда сделать надстройку со своими макросами чтоб потом установив их на пользовательской машинке запускать...

Или можно обойтись книгой с макросами и поместить ее в папку с Файлом Personal.xls
в Application Data ... ?


И еще я знаю что можно каким либо способом подписывать макросы, но вот как ...
увы маленько разобраться не могу.


P.S. Прошу строго не судить, я только учусь.
Автор: WowGun
Дата сообщения: 18.03.2008 16:16
Wukuze


Цитата:
точно не выскакиваю, потому как у меня в таблице 65535 строк, если я не ошибаюсь то моя переменная q определяет именно количество строк. Excel 2003 и там уже количество строк/ столбцов 65535. Но благодарю вас за попытку.


ЕСЛИ бы Вы просто попробовали выполнить одну строку кода ...
Worksheets(3).Cells(2, 10).Select
у Вас ОТПАЛИ бы ВСЕ сомнения, что Ваша переменная q идет именно по СТОЛБЦАМ ...
Автор: ol7ca
Дата сообщения: 18.03.2008 16:16
я все с тем же вопросом, как записать код, который бы находил значения и вставлял формулу в виде X1+X2+...+Xn
я написал похожий код, но он значения записывает как текст (+1+3+5+)а не как формулу.
что-то надо подправить

Dim STR As String
For F = 1 To 5 Step 2
STR = STR & F & "+"
Next
Cells(36, 1) = "+" & STR -?????
End Sub

подскажите кто знает.
спасибо
Автор: WowGun
Дата сообщения: 18.03.2008 16:22
ol7ca
а вот это ЧТО должно делать ? Cells(36, 1) = "+" & STR -?????
Автор: ol7ca
Дата сообщения: 18.03.2008 16:25
SAS888

Цитата:
Ясно. Но это не совсем корректно, т.к.
Цитата:.UsedRange.Rows.Count

но это работает.
и это:

Цитата:
For i = 1 To .Cells.SpecialCells(xlCellTypeLastCell).Row

а это нет

Цитата:
.Cells(65536, 28).End(xlUp).Row

дло было в том, что у меня в тестовом примере в столбце 28 небыло ничего кроме закрашенных ячеек. и Cells(65536, 28).End(xlUp).Row их не видит. а как только я вставляю куда-нибудь цифру в столбец 28, все в порядке.
спасибо за помощь
Автор: WowGun
Дата сообщения: 18.03.2008 16:30
ol7ca, может Вы ЭТО имели в виду
Cells(36, 1).Formula = "=" & Mid(STR, 1, Len(STR) - 1)
Автор: ol7ca
Дата сообщения: 18.03.2008 17:28
WowGun

Цитата:
ol7ca, может Вы ЭТО имели в виду
Cells(36, 1).Formula = "=" & Mid(STR, 1, Len(STR) - 1)

точно!
спасибо!
Автор: nick7inc
Дата сообщения: 18.03.2008 21:01
DocBeen

Цитата:
я то почему то думал что из надстройки можно записанные макросы каким либо образом вызывать...

Можно, но есть своя специфика. Чуть позже напишу.
Автор: nick7inc
Дата сообщения: 18.03.2008 23:59
DocBeen

Цитата:
Вопрос тогда, а как можно тогда сделать надстройку со своими макросами чтоб потом установив их на пользовательской машинке запускать...

Я думаю, что есть несколько способов и могу описать только те, которыми пользовался сам.
1) Если вы планируете писать свои функции для использования их в качестве формул на листе в ячейках, то вызов осуществляется так же, как если бы они были у вас написаны в текущей книге, например, у меня в ячейке набит вызов моего макроса (из XLA), который после обсчёта возвращает результат: =Calculate_isomerisation_2_5($F5;$G5;$H5;$B$25)
2) Если вы планируете вызывать макросы из VBA, то можно воспользоваться функцией Run():

Код: Application.Run "ExcelLib1_Extension.Optimization.Fit", var1, var2, Deriv, DStop, One_parametr_fit, fine_tune_mode
Автор: Wukuze
Дата сообщения: 19.03.2008 07:17
WowGun
Благодарю вас, спасибо.

Добавлено:
Sub &#204;&#224;&#234;&#240;&#238;&#241;1()
Dim q As Long
Dim t As Long
t = 2
q = 2
Do
For q = 2 To 56890
If Worksheets(1).Cells(t, 5) = Worksheets(3).Cells(q, 2) Then Rows(q).Delete Shift:=xlUp
Next
t = t + 1
Loop Until t <> 65536
t = 2
q = 2
Do
For q = 2 To 56890
If Worksheets(2).Cells(t, 5) = Worksheets(3).Cells(q, 2) Then Rows(q).Delete Shift:=xlUp
Next
t = t + 1
Loop Until t <> 65536
End Sub
хотя вот код, но ничего не работает( просто запускается и отпадает, в чем может быть причина?
Автор: Bredun
Дата сообщения: 19.03.2008 09:07
Wukuze

Цитата:
Sub &#204;&#224;&#234;&#240;&#238;&#241;1()

А разве такое имя процедуры допускается?
Автор: AndVGri
Дата сообщения: 19.03.2008 10:31
Wukuze

Цитата:
Loop Until t <> 65536
при t =2, 3, 4 условие выполняется и код выходит из Loop. Проходит только один цикл по q. Замени Loop Until t = 65536
P.S. А для чего код прогонять 2 раза?
Автор: SERGE_BLIZNUK
Дата сообщения: 19.03.2008 10:33
Bredun
Цитата:
А разве такое имя процедуры допускается?

вы это серьёзно спросили?! так это результат копирования в броузер!
там, на самом деле:
Sub Макрос1()

Wukuze
почему не работает код не знаю... пример исходного (или тестового) файла киньте, чтобы было понятнее...
но, в любом случае, я бы начал удалять строчки СНИЗУ вверх...
чтобы нумерация не сбивалась...


Автор: WowGun
Дата сообщения: 19.03.2008 10:59
Wukuze, Вы хотите дойти до строки 65536?
ЕСЛИ да, то
Loop Until t = 65536

Автор: Bredun
Дата сообщения: 19.03.2008 11:00
Wukuze
SERGE_BLIZNUK
Извиняюсь за глупый вопрос , но действительно столкнулся с этим впервые
Автор: Mint86
Дата сообщения: 20.03.2008 05:23
Подскажите, кусочек кода который бы менял пароль на защиту листа и проекта VBA на заранее определенные. Т.е. допустим есть 4 заранее определенных пароля (123, 1234, 12345, 123456). При открытии файла допустим должен установиться первый пароль, при повторном открытии файла второй и т.д.
Это попытка защититься от програм взломщиков пароля, так как пароли на защиту листа находятся мгновенно. Но идея в том что такая программа найдет первый пароль (или соответствующий ему) а при открытии документа пароль поменяется. Незнаю может я не прав и это не поможет. Хотя конечно же это примитивная защита, так как достаточно отключить выполнение макроса и найти пароль. Но ведь надо до этого додуматься (если макрос будет выполняться без видимых для пользователя признаков).
Может это можно сделать с помощью
sub auto_open()

А может есть другие методы защиты? Можно конечно пароль на открытие книги поставить и рекомендовать доступ только для чтения, но нежелательно.
Автор: Wukuze
Дата сообщения: 20.03.2008 07:17
Bredun
AndVGri
SERGE_BLIZNUK
WowGun
спасибо большое, очень помогли, точно при t=2 условие выполняется, спасибо.

Добавлено:
AndVGri
а код прогоняю два раза потому что он выполняться будет на разных листах

Добавлено:
SERGE_BLIZNUK
мне не важна нумерация, просто надо чтобы остались значения которых нет в третьем листе, но благодарю вас за ценный совет, чувствую что в скором времени мне он пригодятся. Дело в том что я просто саппорт, а не прогер, но начальство это мало волнует, к тому же я на свою голову уже как то написал макрос облегчающий жизнь менеджерам. Так что это уже мой третий опыт работы с VBA хотя я и не знаю бейсика. В студенческие годы кодил на дельфи и си.
Автор: ol7ca
Дата сообщения: 20.03.2008 19:07
я написал код, который ищет условие в строках по листам в двух файлах-близнецах (*) и если это так, то возвращает значение.
(*) один файл точная копия другого с меньшим количеством листов, с теми же именами листов и столбцами.
map3 - урезанный источник
b3 - Это приёмник
Но все работает только когда количество листов в обоих файлах одинаково.
Как сделать, чтобы проходя по активному файлу, код выбирал лист с тем же именем в искомом файле?
спасибо.

Dim i As Integer, j As Integer, k As Integer, a
Dim ws As Worksheet, wb As Workbook
Dim v As Variant, temp_range As Range
Application.DisplayAlerts = False
Application.ScreenUpdating = False

For j = 1 To Workbooks("b3.xls").Sheets.Count
Workbooks("b3.xls").Sheets(j).Select

For i = 2 To Workbooks("map3.xls").Sheets(j).Range("aa65536").End(xlUp).Row
If Not IsEmpty(Workbooks("map3.xls").Sheets(j).Cells(i, "AB")) And Not IsError(Workbooks("map3.xls").Sheets(j).Cells(i, "AB")) Then
Workbooks("b3.xls").Sheets(j).Cells(i, 28) = Workbooks("map3.xls").Sheets(j).Cells(i, "AB")
End If
Next i
Next j
End Sub
Автор: wetsoft
Дата сообщения: 20.03.2008 21:16
Кто силен на VBA помощь нужна:

есть каталог в котором _уева туча excel файлов
в каждом файле неопределенное количество листов
нужно всех поочередно открыть и на все листы A4 формат установить
и сохранить разумеется

Как это эффективно сделать в макросах Excel'я
То что сейчас использую написал на дельфях
а там связь с excel очень медленная
(перепробовал все технологии связывания)

ps: могу помочь на асм, pascal, delphi
Автор: AndVGri
Дата сообщения: 21.03.2008 06:35
wetsoft
[more=накидал]
Public Sub SetPageA4()
On Error GoTo errHandle
Dim fso As New Scripting.FileSystemObject
Dim pFile As Scripting.File, pFolder As Scripting.Folder
Dim pSheet As Excel.Worksheet, pBook As Excel.Workbook
Dim pDialog As Office.FileDialog, sPath As String

Set pDialog = Application.FileDialog(msoFileDialogFolderPicker)

If pDialog.Show Then
Application.ScreenUpdating = False
sPath = pDialog.SelectedItems(1&)
Set pFolder = fso.GetFolder(sPath)
For Each pFile In pFolder.Files
If LCase$(fso.GetExtensionName(pFile.Name)) = "xls" Then
Set pBook = Workbooks.Open(pFile.Path)
For Each pSheet In pBook.Worksheets
pSheet.PageSetup.PaperSize = xlPaperA4
Next pSheet
pBook.Close SaveChanges:=True
End If
Next pFile
Application.ScreenUpdating = True
End If
Exit Sub
errHandle:
MsgBox Err.Description, Err.Source
Application.ScreenUpdating = True
End Sub
[/more]
Правда, будет ли это быстрее?
Автор: wetsoft
Дата сообщения: 21.03.2008 09:36
спасибо попробую, обращайся если че...
Автор: Tox0
Дата сообщения: 21.03.2008 10:55
Добрый день! А не поможете сделать такую вещь:

Имеется протокол совещения вида

xx.xx.xxxx|сделать дело
yy.yy.yyyy|сделать второе дело

Можно-ли сделать так, чтобы автоматически создавались листы с датами и строки, датированные этими датами туда копировались?
Заранее огромное спасибо.
ps: Или как-то иначе, но чтобы задания автоматически раскидывались (по файлам/листам/ИТД)
Автор: WowGun
Дата сообщения: 21.03.2008 16:03
не очень понятно ...
ЛИСТ всего один .. или УЖЕ есть листы с ДАТАМИ?
сделанных дел в день Х может быть НЕСКОЛЬКО?
если одни и те же дела в один и тот же день ... ДУБЛИРУЕМ, ИГНОРИРУЕМ, ПЕРЕПИСЫВАЕМ .... ?
Автор: nick7inc
Дата сообщения: 21.03.2008 18:09
ol7ca

Цитата:
Но все работает только когда количество листов в обоих файлах одинаково.
Как сделать, чтобы проходя по активному файлу, код выбирал лист с тем же именем в искомом файле?

В принципе, можно 1)проверить наличие листа с требуемым именем в конкретной книге и 2) если лист такой есть просто получаем указатель на него, иначе ... делаем что-то ещё, например, берём следующее имя листа.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133

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


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