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

» Excel VBA (часть 3)

Автор: ILL Le
Дата сообщения: 02.06.2011 12:35
KF121
ага. С этим получилось, только дебаг вылезае.

Run-time error '1004'
Method 'Range' of object' _Global' failed

Я так думаю это из-за того что все не влезает в ячейку?
Автор: asbo
Дата сообщения: 02.06.2011 12:36
ILL Le, главный вопрос был - это нужно именно на VBA? Что, так много этих N листов, что надо по ним (листам) цикл организовывать? Предполагаю, что нет.

В ворде, кстати, таблицы лего преобразовываются в текст. А если муторно, то через блокнот перенесите все добро в ворд и там благополучно поиском и заменой. В ворде очень продвинутый этот механизм по сравнению с Экселем. Можно черта лысого найти и заменить :)

Код надо дополнить по образцу. А с итоговой переменной Emails - как уж душа велит...

Код: Sub sb_Test
Dim I&, Emails$

For Each WS In Thisworkbook.Worksheets
For I = 2 To WS.Cells.SpecialCells(xlCellTypeLastCell).Row
If WS.Cells(I, 5) Like "*@*.*" Then Emails = Emails & ", " & WS.Cells(I,5)
Next I
Next WS
Emails = Right(Emails, Len(Emails)-2)
End sub
Автор: KF121
Дата сообщения: 02.06.2011 12:40
ILL Le
нет, это изза того что вы обралились к непонятному методу Ragne у некого глобального объекта. надо писать ActiveSheet.Range или конкретно Worksheet("Sheet1").Range
Автор: asbo
Дата сообщения: 02.06.2011 12:45
Если действительно не влазит, то через буфер обмена. Дополнить следующим кодом:

Код:
Dim doEml As DataObject
Set doEml = New DataObject

doEml.SetText (Emails)
doEml.PutInClipboard
Автор: ILL Le
Дата сообщения: 02.06.2011 12:59
KF121
Писать

ActiveSheet.Range
Range("Ñ140").Value = Emails

или

ActiveSheet.Range.Value = Emails

В любом случае пишет
Object doesn't support this property or method

а на Worksheet("Sheet1").Range пишет ошибку компиляции Sub or Function not defined
Автор: KF121
Дата сообщения: 02.06.2011 13:03
ActiveSheet.Range("A1").Value = Emails
Worksheets("Sheet1").Range("A1").Value = Emails

A1 -координаты ячейки куда надо вставить Emails.
ну и соответсенно должен быть лист с именем sheet1 либо указывай любой свой.

p.s. писал на коленке поэтому чуть ошибся в букве.
Автор: andrewkard1980
Дата сообщения: 02.06.2011 14:33

Цитата:
andrewkard1980
Я так озадачился этим "не включая", что забыл ответить

ActiveSheet.Pictures.Insert("http://i.ru-board.com/images/remake1.gif")


Спасибо asbo за напутствие. Сделал
Получилось так:

ActiveSheet.Pictures.Insert(z4).Select
With Selection.ShapeRange
.Top = Cells(i, 1).Top + 5
.Left = Cells(i, 1).Left + 5
.Height = Cells(i, 1).Height + 10
.Width = Cells(i, 1).Width - 10
End With

Где z4 ссілка в виде "http://i.ru-board.com/images/remake1.gif"
Автор: ILL Le
Дата сообщения: 02.06.2011 15:06
KF121
asbo
ZlydenGL
Спасибо вам. Все сделал. Было несколько 10 доков в каждом по 100 листов. Вытащил все адреса.
Автор: andrewkard1980
Дата сообщения: 02.06.2011 22:14
asbo
Не подскажешь? Этот код очень долго работает. Он вставляет большую картинку, потом выделяет ее и подгоняет под конкретную ячейку.
Как ускорить. Задать сразу размер картинки и вставлять в ячейку? Как это сделать?

Автор: asbo
Дата сообщения: 02.06.2011 22:32
andrewkard1980
Сейчас уже не могу попробовать, я не головой - пальцами помню :) Завтра. Но, на вскидку, я бы не работал с Selection, а непосредственно к свойствам картинки обращался. И перерисовку на это время выключил (после отладки, конечно).
Автор: andrewkard1980
Дата сообщения: 02.06.2011 23:33
asbo
Ок, подожду. Спасибо.
Автор: Niiks
Дата сообщения: 02.06.2011 23:44

Цитата:
Добавлено:
Вот, модифицированный вариант. Нашел таки часть архива. Где-то давно подтянул симпатичную демочку - не помню. Заточены три залитые ячейки.

Добавлено:
Это устраняет первый подводный камень. Но уже используется внешняя библиотека. Без хотя бы элементарных знаниев тут не обойтись ( Надо хоть джю-джюдь программить...

asbo, ниччего у меня не получается...
Потому как джюдь-дждь даже не програмлю, увы.
Почитал тут про VBA -интересное дело это всё
Да только вот где время взять, что-бы во всё это вникнуть и самому решить свою проблему...
Видать не судьба


Автор: asbo
Дата сообщения: 03.06.2011 09:43
Niiks, ну а последний-то файл загудел? Там три ячейки, которые реагируют на их изменение руками (ввод, редактирование):

C3 - число - beep - тишина
C5 - строка - kernel - бипер
C7 - дата - kernel - песня через бипер
(данные - используема ф-ция - результат у меня)

Отчитайтесь, плз, по работоспособности.


Добавлено:
andrewkard1980
Ну, собственно, ничего нового к моим предыдущим словам. У меня все это достаточно быстро делается - 2250-2350 мсек. С учетом длины провода, конечно. 500 мсек на картинку, из них 100-400 на провод... Не знаю, медленно это или быстро... Имо, нормально. Выключение перерисовки не ускоряет, а наоброт замедляет работу, что странно :О , но восприятие существенно улучшает - ничего не мигает. Картинки масштабируются с искажениями - надо математику корректировать.



Код:
Dim pPic As Picture
Dim rRng As Range
Dim dWRat As Double
Dim lCnt&
Dim i%
Dim sLink$

lCnt = Timer * 1000
Application.ScreenUpdating = False

sLink = "http://i.ru-board.com/images/remake1.gif"

For i = 3 To 7
Set rRng = Cells(i, 4)
Set pPic = rRng.Parent.Pictures.Insert(sLink)

With pPic
.Top = rRng.Top + 5
.Left = rRng.Left + 5
.Height = rRng.Height + 10
.Width = rRng.Width - 10
End With
Next

Application.ScreenUpdating = True
lCnt = Timer * 1000 - lCnt
Debug.Print lCnt
Автор: Jizo
Дата сообщения: 03.06.2011 11:42
Скажите как можно из вба инициировать нажате кнопки энтер. А то у меня макрос каждый раз прогоняет процедуру поиска решения после которого каждый раз выскакивает окно с отчётом, и там приходится нажимать кнопку ok или энтер на клаве. Может можно ещё както побороть это выскакивающее окошко...
Автор: ZlydenGL
Дата сообщения: 03.06.2011 11:43
Рекомендую поискать хелп по замечательной API команде SendMessage.
Автор: Amrek
Дата сообщения: 03.06.2011 11:59
Добрый день, не подскажите решение моей проблемы.

Требуется чтобы при нажатие на любую ячейку в столбце A5 вызывалось окно добавление Гиперссылки на файл, и следовательно после появление ссылки, при выборе этой ячейки мы открывали этот файл. Как я понимаю надо либо макросом вызвать команду вызова создание гиперссылки, либо имитировать нажатие кнопок Ctrl+K.
Автор: KF121
Дата сообщения: 03.06.2011 12:11
добавить гиперссылку просто,

Worksheets(1).Hyperlinks.Add Anchor:=Worksheets("Name").Cells(Row, Col), Address:=IssueFolder & "/" & ProjectName & "_EXTISSUE_" & num & ".doc", TextToDisplay:=ProjectName & "_EXTISSUE_" & num & ".doc"

а дальше сами думайте, толи это сделать макрос кторый будет пробегать по всем ячейкам и делать гиперссылку, или добюавлять гаперссылку при изменении ячейки.
Автор: asbo
Дата сообщения: 03.06.2011 12:13
Amrek
Что имеется ввиду под "нажатие"? Клик ЛКМ, т.е. выделение ячейки?
Ячейка перед этим пустая? Т.е алгоритм такой:
Если ячейка пустая - вызвать диалог и вставить гиперссылку. Если в ней уже есть гс - проследовать по ней. Так?
Автор: Amrek
Дата сообщения: 03.06.2011 12:23
Да все правильно.
Автор: asbo
Дата сообщения: 03.06.2011 12:58
Amrek
Я еще не совсем понял вот это "в столбце A5". Сделал применительно к столбцу 1. Выделение любой ячейки из этого столбца приведет или к обработке кода. Его надо поместить в модуль листа:

Код:
Private Sub Worksheet_SelectionChange(ByVal pTgt As Range)
With pTgt
Select Case .Column
Case 1
Select Case .Hyperlinks.Count > 0
Case True
'Stop
Case False
'Stop
Application.Dialogs(xlDialogInsertHyperlink).Show
End Select
Case Else
'Stop
End Select
End With
End Sub
Автор: andrewkard1980
Дата сообщения: 03.06.2011 13:59
Да, asbo, так значительно лучше.
Спасибо огромное.
Автор: Amrek
Дата сообщения: 03.06.2011 14:07
Cделал как у вас по инструкции, да то что надо получается, но теперь у меня получается 2 макроса ссорятся между собой.

Вот ссылка на мой пример, я сам не силен в макросах даже этот пример писал не я.

http://rghost.ru/9200841
Пароль от листа 123
Пароли пользователей
user = Array("Вася", "Петя", "Витя", "Коля")
parol = Array("111", "222", "333", "444")

Первоначально требуется разграничить доступ к определенным строкам по паролям, все успешно, но вот теперь пользователю требуется в 11 столбец добавлять ссылки на файлы.То есть если зашел Вася, то он мог добавить ссылку на файл только в строке 5 столбце 11, отмечено желтым цветом. Файл динамический и строки будут добавляться. Если прописать ваш код то при нажатии на ячейку вываливается с ошибкой.
Автор: andrewkard1980
Дата сообщения: 03.06.2011 14:18
Не совсем понятен тег Parent?
Автор: asbo
Дата сообщения: 03.06.2011 14:36
andrewkard1980

Цитата:
Не совсем понятен тег Parent

Тег :))
Картинки (Pictures) принадлежат листу (WorkSheet), а не диапазону (Range). С помощью Parent мы получаем родительский объект диапазона - лист.

? Cells(1, 1).Parent.Name
Автор: andrewkard1980
Дата сообщения: 03.06.2011 14:46

Ага, теперь ясно.

Cells(1, 1).Parent.Name = SheetName
Так?
Автор: asbo
Дата сообщения: 03.06.2011 14:59
andrewkard1980, так, но немного не так :)

Cells(1, 1).Parent.Name = SheetName
Это операция присваивания листу имени, хранящемся в переменнной SheetName

? Cells(1, 1).Parent.Name
Это вывод в окне дебаггера имени родительского объекта диапазона, содержащего единственную ячейку A1.

Добавлено:
Amrek, у меня не получается взглянуть на работу кода в этой книге - отсутствуют именованные диапазоны, а именно - Range("Таблица1"). УжЕ здесь все встает.
Автор: andrewkard1980
Дата сообщения: 03.06.2011 15:04
Т.е. последовательность всегда такова: книга - лист - диапазон - ячейка?
И
? Cells(1, 1).Parent.Parent.Name
Это вывод в окне дебаггера имени родительского объекта листа, содержащего диапазон, который в свою очередь содержит единственную ячейку A1.
Автор: Amrek
Дата сообщения: 03.06.2011 15:20
Странно что встает, у меня если что Exel 2007, Таблица1 она строго нарисована, и весь запрос идет по столбцам.
Автор: asbo
Дата сообщения: 03.06.2011 15:21
andrewkard1980, почти. Обращение к родительским объектам могут быть опущены. Вместо них будут подставлены активные на момент выполнения кода.

См. поиск хэлп в VBA по "Object Model"

Добавлено:
Amrek, увы, у меня 2003.
Автор: andrewkard1980
Дата сообщения: 03.06.2011 15:41
asbo
Благодарю, почитаю.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127

Предыдущая тема: VS 2010


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