Консультация № 172267
17.09.2009, 13:09
0.00 руб.
0 10 0
Уважаемые эксперты подскажите, пожалуйста, в следующем:
если взять и по простому записать в Ворде макрос через Сервис>Макрос>Начать запись следующие комбинации Контол+5, всё выделится, далее Контрол+Инсерт, всё скопируется, затем справа в лифте при открытом буфере обмена указать на скопированный объект и указать удалить, закончить запись. Затем просмотрим записанный код:
Selection.WholeStory
Selection.Copy
Или запустим этот макрос. Увидим, что всё записалось кроме последней операции, возможно ли её и как записать, чтобы она работала. Спасибо Эндрю.

Обсуждение

Неизвестный
18.09.2009, 12:02
общий
А можно по конкретнее описать, что вы хотите сделать?
Как я понял вы хотите скопировать весь текс в буфер и потом его оттуда удалить?
Неизвестный
18.09.2009, 19:11
общий
Patriotix-N:
Здравствуйте
Например я скопировал руками текст "ДИОД", затем запустил макрос, он скопировать весь текст, часть текста в буфер и потом его где надо вставил, а затем чтобы замёл за собой следы, то есть, я знаю что в буфере есть "ДИОД", имеется в виду нажав Пасте должен вставиться "ДИОД" и ничего более, а то что макрос копировал это делал не я и я это не могу помнить, также чтобы ВБА удалил и с лифта скопированный им объект, лифтом я называю левую область в документе когда нажата опция правка буфер обмена.
Спасибо Эндрю
Неизвестный
18.09.2009, 19:13
общий
Patriotix-N:
Ошибся:
лифтом я называю левую область в документе когда нажата опция правка буфер обмена
надо читать как
лифтом я называю правую область в документе когда нажата опция правка буфер обмена
Неизвестный
19.09.2009, 15:23
общий
Ципихович Эндрю:
Каким образом вы хотите определить?
Цитата: 238244
и потом его где надо вставил

Что значит "потом" и "где надо"? Как вы планируете их определить?
Можете конкртено описать всю задумку?
Если надо только с буфером разобраться то решение:
Код:

dim a as string

a = Application.Selection
Selection.Collapse 'если не хотите заменять выделенный текст
Selection.Text = a ' или Selection.TypeText (a)

Это простейший вариант. Но тут все будет зависить от того, что именно вам требуется... Если просто скопировать текст программой, то этот вариант для вас, если же вам надо чтобы текст попадал именно в буфер обмена и вставлялся кнопкой "Вставить" то тогда надо придумывать другие варианты.
Неизвестный
19.09.2009, 18:39
общий
Patriotix-N:
Потом это после того как скопировал, где надо это может быть в начале документа, в середине в конце, в другом документе без разницы. Планирую я определить очень просто
после окончания макроса я нажав кнопку Пастэ долже вставить только "Диод" и ничего более, и чтобы в првой области в лифте не было этого скопированного ВБА объекта.
И кроме того меня кроме того, что я хочу сделать интерисует и теория, почему:
если взять и по простому записать в Ворде макрос через Сервис>Макрос>Начать запись следующие комбинации Контол+5, всё выделится, далее Контрол+Инсерт, всё скопируется, затем справа в лифте при открытом буфере обмена указать на скопированный объект и указать удалить, закончить запись. Затем просмотрим записанный код:
Selection.WholeStory
Selection.Copy
Или запустим этот макрос. Увидим, что всё записалось кроме последней операции, куда делась???
Ваш код я пробовал он делает не то, что надо. Эндрю
Неизвестный
20.09.2009, 20:23
общий
Дело в том, что в макрос записываются не все действия, которые производятся в окне документа. В том числе и очистка буфера.

Может вам поможет что-то вроде этого?
Процедура очистки есть в вашем вопросе №172169
Код:
Sub Макрос1()
'
' Макрос1 Макрос
'
Application.ShowClipboard
Selection.Copy
Selection.Collapse
Selection.Paste
Call ClearClipboard
Application.ShowClipboard

End Sub

У меня этот код работает, но опять таки не зная всей вашей идеи(вы ее толком так и не объяснили), не могу сказать, то ли это, что было необходимо.

Можете также попробовать проврять открыта ли панель, и поробоваь работать с ее элементами: возможно, как раз то, что вам нужно. По идее можно программно добавлять и удалять элементы с панели. Возможно новые объекты буфера будут идентифицироваться как объекты на панели. У меня к сожалению в word 2007 это не получилось.
Код:

If Application.CommandBars("Clipboard").Visible = True Then
...
'или If Application.CommandBars.Item("Clipboard").Visible = True Then



Неизвестный
21.09.2009, 08:47
общий
Patriotix-N:
Спасибо за обсуждение моей проблемы из Ваших строк кода:
If Application.CommandBars("Clipboard").Visible = True Then Beep 'пробовал в Ворд 2003 не работает
If Application.CommandBars.Item("Clipboard").Visible = True Then Beep 'пробовал в Ворд 2003 не работает
Мои варианты:
WordBasic.EditOfficeClipboard 'открывание панели буфера обмена для офиса 2003, 2007
CommandBars("Task Pane").Visible = False 'закрывание панели буфера обмена для офиса 2003
CommandBars("Office Clipboard").Visible = False 'закрывание панели буфера обмена для офиса 2007
Попробовал Ваш код не то, вероятно моя проблема не имеет решения без Вин Айпи, хотел у вас спросить что такое Selection.Collapse,
посмотрел в словаре не понял:

Collapse [kq'lxps]
1. n
1) разрушение
2) упадок сил
3) крушение (планов, надежд)
2. v
1) рушиться
2) изнемочь; упасть духом
Ваш ответ по теориии я понял. Честно говоря не пойму как ещё объснить, что я хочу
Я хочу чтобы в правой области в лифте не было скопированного ВБА объекта, чтобы после того как макрос
закончил свою работу нажав вставить мышью, или Пастэ на клавиатуре, чтобы не вставлялось то, что мною лично не копироавлось
Эндрю
Неизвестный
21.09.2009, 10:49
общий
Так чем же не решает вашу проблему код
Код:

Application.ShowClipboard 'Меняет состояние панели буфера обмена. Если она открыта закрывает, при закрытой панели наблюдение за буфером не ведется. А последний объект занесенный на панель остается в памяти. Проверял в Word 2007.
Selection.Copy
Selection.Collapse ' Когда я копирую текст, я его выделяю и запускаю макрос. Если убрать эту строку, то изменений не будет видно, т.к. текст заменит выделенный фрагмент, а именно его мы и копировали.
Selection.Paste
Call ClearClipboard 'Очищяем буфер обмена.
Application.ShowClipboard 'Если сразу открыть панель, то последний фрагмент текста который надохится в буфере обмена автоматически попадет на панель, поэтому предварительно буфер надо очистить. Потом показывается панель.

По поводу Collapse.
Это слово надо было искать не в словаре, а во встроенной справке VBA.
Там написано:
Код:


Word Developer Reference
Selection.Collapse Method
Collapses a selection to the starting or ending position. After a selection is collapsed, the starting and ending points are equal.
Syntax

expression.Collapse(Direction)

expression Required. A variable that represents a Selection object.

Parameters

Name Required/Optional Data Type Description
Direction Optional Variant The direction in which to collapse the range or selection. Can be either of the following WdCollapseDirection constants: wdCollapseEnd or wdCollapseStart. The default value is wdCollapseStart.

Example


This example collapses the selection to an insertion point at the beginning of the previous selection.

Visual Basic for Applications
Selection.Collapse Direction:=wdCollapseStart


© 2006 Microsoft Corporation. All rights reserved.



Мой код у вас не работает или раобтает не так как надо? И вы вобще его пробовали или просто прочитали и решили, что это не то? Он как раз копирует текст так, что то что было в буфере до копирования сохранятся. А то что копируется макросом не заносится туда.
Неизвестный
21.09.2009, 16:11
общий
Patriotix-N:

Ваш код работает, только не так как надо мне, Вы спрашиваете чем не нравится этот код
поясняю, что происходит во всяком случае в Ворд 2003 пошагово
1)при открытом лифте справа
был у меня в буфере один объект ДИОД, в этом могу удостоверится глянув в лифт, нажав кнопку Пастэ, вставился ДИОД
запустил Ваш макрос перед запуском макроса было выделено слово Один, получаю:
в лифте вижу два объекта ниже ДИОД, выше Один, нажимаю Пастэ, ничего не вставляется, кликаю мышью на эти два объекта по очереди они оба вставляются
2)при закрытом лифте справа
был у меня в буфере один объект ДИОД, в этом могу удостоверится глянув в лифт, затем закрыл его, нажав кнопку Пастэ, вставился ДИОД
запустил Ваш макрос перед запуском макроса было выделено слово Один, получаю:
справа появился лифт в нём вижу два объекта ниже ДИОД, выше Один, нажимаю Пастэ, ничего не вставляется, кликаю мышью на эти два объекта по очереди они оба вставляются

Оба эти варианты не подходят, поясню, чего я добиваюсь:
был в буфере обмена один объект ДИОД, я об этом знаю, так как сам его копировал, затем например запустил макрос, в котором есть строка Селектион Копи, вопрос как этот скопированный объект сделать чтобы он вообще не попадал в лифт или его оттуда удалить, и чтобы нажав Пастэ вставлялся только в моём случае ДИОД
Вы могли бы по поводу Collapse пояснить на русском языке

Эндрю
Неизвестный
22.09.2009, 20:47
общий
Ципихович Эндрю:
Я же обяснил. Collaps сдвигает текст при вставке. Относительно выделения. Т.е. если вы ставляете текст, когда выделен фрагмент другого текста, то эта функция сдвигает ваш вставляемый текст относительно этого выделения, по умолчанию стоит параметр wdCollapseStart, что означает, что курсор встанет на место до начала выделения, и туда вставится текст.
Вам надо чтобы всталялось именно по кнопке Paste или с панели буфера обмена?
Если можно с панели, то попробуйте заменить Application.ShowClipboard на CommandBars("Office Clipboard").Enabled = false и true соответственно. (У вас офис другой и соответственно работает, наверно не совсем так).
Код:

If Application.CommandBars("Office Clipboard").Enabled And Application.CommandBars("Office Clipboard").Visible Then
Application.CommandBars("Office Clipboard").Enabled = False
Selection.Copy
Selection.Collapse
Selection.Paste
Call ClearClipboard
Application.CommandBars("Office Clipboard").Enabled = True
End If


Проблема заключается в том, что в тот момент когда включается панель буфера обмена, она автоматически захватывает текущее содержимое буфера.
Поэтому если не очищять буфер, то после макроса будет появляться скопированный текст. Но только в том случае если панель открыть. Если же последнюю строчку убрать Application.CommandBars("Office Clipboard").Enabled = True(т.е. не отображать панель после завершения макроса, при этом подразумевается, что пользователь тоже не будет ее открывать после копирования), то содержимое буфера на панель не попадет. В этом случае можно восстанавливать содержимое буфера обмена в состояние, до копирования. Но не забывайте, что свойство Enabled совсем отключает панель. И в этом случае надо будет пользоваться Visible.
Код:

Public Function GetClipboard() As Variant
GetClipboard = "": On Error Resume Next
Dim MyDataObj As New DataObject
MyDataObj.GetFromClipboard: GetClipboard = MyDataObj.GetText
End Function

Public Sub ClearClipboard()
Dim MyDataObj As New DataObject
MyDataObj.SetText "": MyDataObj.PutInClipboard
End Sub

Sub Макрос1()
On Error Resume Next
Dim MyDataObj As New DataObject

If Application.CommandBars("Office Clipboard").Enabled And Application.CommandBars("Office Clipboard").Visible Then
Application.CommandBars("Office Clipboard").Visible = False
Selection.Copy
Selection.Collapse
Selection.Paste
Call ClearClipboard
Application.CommandBars("Office Clipboard").Visible = True
Else
MyDataObj.SetText GetClipboard()
Selection.Copy
Selection.Collapse
Selection.Paste
Call ClearClipboard
MyDataObj.PutInClipboard
End If

End Sub

Заметил что если в буфер Word (на панель всмысле) скопировать текст из ворда, то если верхним элементом в буфере(на панели) будет аналогичный текст, то новый объект на панели не появится. Если же скопировать тот же текст в другом приложении, то он появляется на панели, но с другим значком.
Возможно это связано именно с типом скопированного текста - какой-нибудь WordText, но я в VBA, если честно, работаю редко и не могу сказать как работает процедура копирования в Word'е. Возможно там все гораздо сложнее, и дело не в типе объекта, а в самой процедуре копирования. Тогда можете попробовать решить эту проблему с помощью копирования исходного текста.
P.S.
Все мои коды и пояснения относятся к Word 2007.
P.P.S
Но, самое главное, я до сих пор не могу понять, почему вы хотите использовать именно процедуру копирования... Чем вас не устраивает мой первый вариант. Он бы удовлетворил всем вашим требованиям. Может вам надо идти совсем в другом направлеии?
Форма ответа