Vba excel переменную в буфер

Работа с буфером обмена в VBA Excel: копирование и вставка ячеек, копирование текста из переменной, очистка буфера обмена. Объект DataObject. Примеры.

Копирование и вставка ячеек

Копирование содержимого и форматов ячеек (диапазона) в буфер обмена осуществляется методом Range.Copy, а вставка – методом Worksheet.Paste:

‘Копирование одной ячейки в буфер обмена

Range(«A10»).Copy

Cells(10, 1).Copy

‘Копирование диапазона ячеек в буфер обмена

Range(«B8:H12»).Copy

Range(Cells(8, 2), Cells(12, 8)).Copy

‘Вставка ячейки (диапазона) из буфера обмена на рабочий лист

ActiveSheet.Paste Range(«A20»)

ActiveSheet.Paste Cells(20, 1)

При вставке диапазона ячеек из буфера обмена на рабочий лист достаточно указать верхнюю левую ячейку места (диапазона) вставки.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, формулы, примечания и т.д.), а также применения к диапазону транспонирования или вычислений, используется метод Range.PasteSpecial (специальная вставка).

Буфер обмена и переменная

Передача текста между переменной и буфером обмена в VBA Excel осуществляется с помощью объекта DataObject. Стоит иметь в виду, что на некоторых компьютерах DataObject может некорректно работать при открытом окне проводника.

Объект DataObject

DataObject – это область временного хранения форматированных фрагментов текста, используемая в операциях переноса данных.

Подробнее об элементе DataObject вы можете прочитать на сайте разработчиков.

Методы объекта DataObject:

Метод Описание
GetFromClipboard Копирует данные из буфера обмена в DataObject
GetText Извлекает текстовую строку из объекта DataObject в указанном формате
PutInClipboard Перемещает данные из DataObject в буфер обмена
SetText Копирует текстовую строку в DataObject, используя указанный формат

Копирование текста из переменной в буфер обмена

Sub Primer2()

Dim s As String, myData As New DataObject

s = «Копирование текста из переменной в буфер обмена»

‘Копируем текст из переменной в DataObject

myData.SetText (s)

‘Перемещаем текст из DataObject в буфер обмена

myData.PutInClipboard

‘Проверяем содержимое буфера обмена

ActiveSheet.Paste Range(«A1»)

End Sub

Копирование текста из буфера обмена в переменную

Sub Primer3()

Dim s As String, myData As New DataObject

Range(«A1») = «Копирование текста из буфера обмена в переменную»

‘Копируем данные из ячейки в буфер обмена

Range(«A1»).Copy

‘Копируем данные из буфера обмена в DataObject

myData.GetFromClipboard

‘Извлекаем текст из объекта DataObject и присваиваем переменной s

s = myData.GetText

‘Проверяем содержимое переменной s

MsgBox s

End Sub

Очистка буфера обмена

Специального метода для очистки буфера обмена в VBA Excel нет. Для решения этой задачи можно использовать выход из режима вырезания-копирования:

Application.CutCopyMode = False

Следующий пример демонстрирует вставку скопированной ячейки "A1" в ячейки "A2" и "A3" и отсутствие вставки в ячейки "A4" и "A5" после строки Application.CutCopyMode = False:

Sub Primer4()

Range(«A1») = «Очистка буфера обмена»

Range(«A1»).Copy

ActiveSheet.Paste Range(«A2»)

ActiveSheet.Paste Range(«A3»)

Application.CutCopyMode = False

On Error Resume Next

ActiveSheet.Paste Range(«A4»)

ActiveSheet.Paste Range(«A5»)

End Sub

Оператор On Error Resume Next необходим для обработки (пропуска) ошибки, возникающей при вставке из пустого буфера обмена.

Функции для работы с буфером обмена

В некоторых системах, начиная с Windows 8, метод DataObject.PutInClipboard не работает правильно: если открыт хотя бы один экземпляр Проводника (папка), в буфер обмена записываются два квадратика. Следующие функции должны решить эту проблему:

‘Функция записи текста в буфер обмена

Function SetClipBoardText(ByVal Text As Variant) As Boolean

    SetClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.SetData(«Text», Text)

End Function

‘Функция вставки текста из буфера обмена

Function GetClipBoardText() As String

    On Error Resume Next

    GetClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.GetData(«Text»)

End Function

‘Функция очистки буфера обмена

Function ClearClipBoardText() As Boolean

    ClearClipBoardText = CreateObject(«htmlfile»).parentWindow.clipboardData.clearData(«Text»)

End Function

Пример использования функций для работы с буфером обмена:

Sub Primer()

Dim s As String

    s = «Копирование текста из переменной в буфер обмена»

    ‘Копируем текст в буфер обмена

    SetClipBoardText (s)

    ‘Вставляем текс из буфера обмена в ячейку «A1»

    Range(«A1») = GetClipBoardText

    ‘Очищаем буфер обмена, если это необходимо

    ClearClipBoardText

End Sub


I know this should be a super easy solution but I can’t fathom it out.

I’m just making a simple button which copies the values in the range of ‘Output’ to my clipboard.

Private Sub CommandButton1_Click()
Dim Output As String
    Output = Range("Output")
    MsgBox (Output + " Text has been copied")
End Sub

I want Output to copy to my clipboard.

Edit:

Many Thanks
Sam

asked Jan 6, 2016 at 10:22

SamCramphorn's user avatar

SamCramphornSamCramphorn

1431 gold badge2 silver badges14 bronze badges

1

I did a 180 on it and changed it around,

Solution below:

Private Sub CommandButton1_Click()
Dim myData As DataObject
Dim Output As String

Output = UCase(InputBox("Type Text Here"))

If Output = "" Then
End
Else
End If
Set myData = New DataObject
myData.SetText Output
myData.PutInClipboard
MsgBox (Output + " text has been copied")
End Sub

answered Jan 6, 2016 at 12:22

SamCramphorn's user avatar

SamCramphornSamCramphorn

1431 gold badge2 silver badges14 bronze badges

You would be better declaring Output as an object variable (or, more specifically, as a range).

You can then use the value of the range within the messagebox, whilst also copying the value to the clipboard.

Private Sub CommandButton1_Click()
    Dim Output As Range
    Set Output = Range("Output")

    Output.Copy
    MsgBox (Output + " Text has been copied")
End Sub

answered Jan 6, 2016 at 10:34

luke_t's user avatar

luke_tluke_t

2,9153 gold badges22 silver badges38 bronze badges

1

I assume you want the Values of a Range which is called «Output»

The script below will add join (like the WorkSheetFunction «Concantenate») and then display it in the MsgBox and copy it to the ClipBoard.

Private Sub CommandButton1_Click()

    Dim Output As Range
    Dim MyString As String
    Dim OutputText As DataObject

    Set OutputText = New DataObject
    Set Output = Range("A1:A5")

    MyString = ""

    For Each cell In Output

        MyString = MyString & cell.Value & " "

    Next cell

    OutputText.SetText MyString
    OutputText.PutInClipboard

    MsgBox (MyString + " Text has been copied")

End Sub

answered Jan 6, 2016 at 10:43

Jean-Pierre Oosthuizen's user avatar

Update! Better Solution from ExcelHero

Excel MVP Daniel Ferry from ExcelHero graciously provided a much more eloquent solution than my original article over on the StackOverflow forum.

In the below solution, he is utilizing the Microsoft HTML Object Library to access the clipboard. This solution will work with 32-bit and 64-bit versions of Excel which has been a pain point for many proposed VBA solutions out there on the web. His VBA function also allows you to both read from the clipboard and write to the clipboard depending on if you pass through a variable. Check out this beautiful piece of code (and if you dare keep scrolling to see my original behemoth of a solution!).

Text To The Clipboard (original solution)

There may be instances where you create a macro that reads in text and sticks it in your computer’s clipboard so you can manually paste it somewhere else.  The most prominent way to do this, is to use a DataObject variable from the Forms library (language).

You can reference this library by either going to your Visual Basic Editor’s tools menu and enabling the Microsoft Forms 2.0 Object Library reference or by simply adding a userform to your project (the userform doesn’t have to do anything, it’s very existence tells your project that the Forms library is needed).

Below is a very self-explanatory snippet of VBA code that will show you how to copy text straight into your computer’s clipboard.

Sub CopyTextToClipboard()
‘PURPOSE: Copy a given text to the clipboard (using DataObject)
‘SOURCE: www.TheSpreadsheetGuru.com
‘NOTES: Must enable Forms Library: Checkmark Tools > References > Microsoft Forms 2.0 Object Library

Dim obj As New DataObject
Dim txt As String

‘Put some text inside a string variable
  txt = «This was copied to the clipboard using VBA!»

‘Make object’s text equal above string variable
  obj.SetText txt

‘Place DataObject’s text into the Clipboard
  obj.PutInClipboard

‘Notify User
  MsgBox «There is now text copied to your clipboard!», vbInformation

End Sub

There’s An Excel Office Bug!

I initially started investigating how to copy text to the clipboard while running someone else’s code.  This code worked perfectly on my work computer (using Windows 7/Excel 2007), however it kept copying just two question marks to the clipboard while executing the VBA code on my home computer (using Windows 8.1/Excel 2013).  It took me forever to narrow down what was causing this to happen (the source code was very long) and of course, the problem ended up being a bug on the part of Microsoft!

Luckily, there were many others who were running into this very issue on the forums.  Someone posted that they were actually able to troubleshoot this problem with a Microsoft support member a couple years ago (maybe in 2010) and that person determined it to be a bug.  The support member pointed to a solution using a Windows API as a workaround (shown in the next section).  

Copy To Clipboard With Windows API

Below is the API workaround suggested by Microsoft to get around the «SetText» bug.  It has three parts: an API declaration section, a Function routine, and then I used a similar subroutine macro to place the desired text into the Clipboard.

UPDATE: I have modified the API declarations to work with both 64-bit and 32-bit versions of Microsoft Office

‘Handle 64-bit and 32-bit Office
#If VBA7 Then
  Private Declare PtrSafe Function GlobalUnlock Lib «kernel32» (ByVal hMem As LongPtr) As LongPtr
  Private Declare PtrSafe Function GlobalLock Lib «kernel32» (ByVal hMem As LongPtr) As LongPtr
  Private Declare PtrSafe Function GlobalAlloc Lib «kernel32» (ByVal wFlags As LongPtr, _
    ByVal dwBytes As LongPtr) As LongPtr
  Private Declare PtrSafe Function CloseClipboard Lib «user32» () As LongPtr
  Private Declare PtrSafe Function OpenClipboard Lib «user32» (ByVal hwnd As LongPtr) As LongPtr
  Private Declare PtrSafe Function EmptyClipboard Lib «user32» () As LongPtr
  Private Declare PtrSafe Function lstrcpy Lib «kernel32» (ByVal lpString1 As Any, _
    ByVal lpString2 As Any) As LongPtr
  Private Declare PtrSafe Function SetClipboardData Lib «user32» (ByVal wFormat As LongPtr, _
    ByVal hMem As LongPtr) As LongPtr
#Else
  Private Declare Function GlobalUnlock Lib «kernel32» (ByVal hMem As Long) As Long
  Private Declare Function GlobalLock Lib «kernel32» (ByVal hMem As Long) As Long
  Private Declare Function GlobalAlloc Lib «kernel32» (ByVal wFlags As Long, _
    ByVal dwBytes As Long) As Long
  Private Declare Function CloseClipboard Lib «user32» () As Long
  Private Declare Function OpenClipboard Lib «user32» (ByVal hwnd As Long) As Long
  Private Declare Function EmptyClipboard Lib «user32» () As Long
  Private Declare Function lstrcpy Lib «kernel32» (ByVal lpString1 As Any, _
    ByVal lpString2 As Any) As Long
Private Declare Function SetClipboardData Lib «user32» (ByVal wFormat _
    As Long, ByVal hMem As Long) As Long
#End If

Const GHND = &H42
Const CF_TEXT = 1
Const MAXSIZE = 4096

Function ClipBoard_SetData(MyString As String)
‘PURPOSE: API function to copy text to clipboard
‘SOURCE: www.msdn.microsoft.com/en-us/library/office/ff192913.aspx

#If VBA7 Then
  Dim hGlobalMemory As LongPtr, lpGlobalMemory As LongPtr
  Dim hClipMemory As LongPtr, x As LongPtr
#Else
  Dim hGlobalMemory As Long, lpGlobalMemory As Long
  Dim hClipMemory As Long, x As Long
#End If

‘Allocate moveable global memory
  hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)

‘Lock the block to get a far pointer to this memory.
  lpGlobalMemory = GlobalLock(hGlobalMemory)

‘Copy the string to this global memory.
  lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)

‘Unlock the memory.
  If GlobalUnlock(hGlobalMemory) <> 0 Then
    MsgBox «Could not unlock memory location. Copy aborted.»
    GoTo OutOfHere2
  End If

‘Open the Clipboard to copy data to.
  If OpenClipboard(0&) = 0 Then
    MsgBox «Could not open the Clipboard. Copy aborted.»
    Exit Function
  End If

‘Clear the Clipboard.
  x = EmptyClipboard()

‘Copy the data to the Clipboard.
  hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)

OutOfHere2:
  If CloseClipboard() = 0 Then
    MsgBox «Could not close Clipboard.»
  End If

End Function

Sub CopyTextToClipboard()
‘PURPOSE: Copy a given text to the clipboard (using Windows API)
‘SOURCE: www.TheSpreadsheetGuru.com
‘NOTES: Must have above API declaration and ClipBoard_SetData function in your code

Dim txt As String

‘Put some text inside a string variable
  txt = «This was copied to the clipboard using VBA!»

‘Place text into the Clipboard
   ClipBoard_SetData txt

‘Notify User
  MsgBox «There is now text copied to your clipboard!», vbInformation

End Sub

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris
Founder, TheSpreadsheetGuru.com

1014 / 118 / 2

Регистрация: 26.08.2011

Сообщений: 1,113

Записей в блоге: 2

1

Как значение поместить в буфер обмена

27.08.2016, 20:58. Показов 4142. Ответов 9


Студворк — интернет-сервис помощи студентам

Нужно значение переменной поместить в буфер обмена для вставки его в другом месте (на сайте в запрос, например)
Программно вставлять мне не нужно. Я не так часто планирую пользоваться этой функцией.
Но иногда очень муторно вводить ряд цифр с одной проги в другую



0



11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

27.08.2016, 22:19

2

Нужно значение переменной поместить в буфер обмена для вставки его в другом месте (на сайте в запрос, например)
Программно вставлять мне не нужно.

ХМММ!
А переменная не в программе?!
На рабочем столе?
Или на простом столе?!
Может просто на дорожке валяется?



0



kuklp

1702 / 189 / 19

Регистрация: 20.11.2011

Сообщений: 281

28.08.2016, 19:28

3

1. В любом модуле книги пишем код:

Visual Basic
1
2
3
4
5
Sub GetFormula_For_VBA()    ' скопировать в буфер обмена формулу из ActiveCell, готовую для вставки в код VBA
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText "qwueyqwry": .PutInClipboard
    End With
End Sub



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

28.08.2016, 21:13

4

Цитата
Сообщение от kuklp
Посмотреть сообщение

‘ скопировать в буфер обмена формулу из ActiveCell, готовую для вставки в код VBA

следовало заменить на

Visual Basic
1
' скопировать в буфер обмена "qwueyqwry"

У меня тоже есть эта заготовка, кажется позавчера на форуме тоже постил.



1



1702 / 189 / 19

Регистрация: 20.11.2011

Сообщений: 281

28.08.2016, 21:16

5

Привет Игорь. Я ж комментариев писать не люблю и сам их никогда не читаю В макросе изменил, а коммент… К тому же не нашел, как тут редактировать свои посты. Видать срок истек.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

28.08.2016, 21:19

6

Сергей, привет!
Я не с претензией, а как информация для форумчан.
А редактировать похоже что можно или сразу, или позже если успеешь написать сразу следующий пост, который добавится к предыдущему. К сожалению.



0



AndreA SN

1014 / 118 / 2

Регистрация: 26.08.2011

Сообщений: 1,113

Записей в блоге: 2

11.09.2016, 10:40

 [ТС]

7

Ребята.Извините за отлынивание. Был в командировке. Но чувствую, что моя очередь разливать по стопкам
Конкретизирую забодачку.
Ранее было присвоено командой

Visual Basic
1
me.Label111.Tag = содержимое_переменной

Хочется, чтобы по клику на лабел содержимое его tag оказалось в буфере обмена.
что-то типа

Visual Basic
1
2
3
Private Sub Label111_Click()
буфер обмена = Me.Label111.Tag
End Sub

Обращаю внимание: включен Option Explicit
что написать в функции вместо «буфер обмена»?

Добавлено через 4 минуты
kuklp, от когда-нить будет больно за «не люблю писать комментарии». Прям как мне — кусал свою руку правую, пока левая за нее не вступилась… Мигаю вот теперь… рефлекторное…



0



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

11.09.2016, 19:58

8

Так ведь всё прозрачно:

Visual Basic
1
2
3
4
5
Private Sub Label111_Click()
With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
   .SetText me.Label111.Tag: .PutInClipboard
End With
End Sub



1



1702 / 189 / 19

Регистрация: 20.11.2011

Сообщений: 281

11.09.2016, 20:25

9

Цитата
Сообщение от AndreA SN
Посмотреть сообщение

когда-нить будет больно за «не люблю писать комментарии»

Ну, за 25 лет без комментариев еще ни разу не было



0



1014 / 118 / 2

Регистрация: 26.08.2011

Сообщений: 1,113

Записей в блоге: 2

17.09.2016, 19:23

 [ТС]

10


потому что или проги короткие были или не догнали ни разу)))
шучу каэшна)))



0



The code given at the Microsoft site works in Excel too, even though it is under Access VBA. I tried it in Excel 365 on a 64 bit Windows 10.

Microsoft Site Link: https://learn.microsoft.com/en-us/office/vba/access/Concepts/Windows-API/send-information-to-the-clipboard

Copying here for answer completeness.

Option Explicit
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hWnd As Long) As Long
Private Declare Function EmptyClipboard Lib "user32.dll" () As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function IsClipboardFormatAvailable Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function SetClipboardData Lib "user32.dll" (ByVal wFormat As Long, ByVal hMem As Long) As Long
Private Declare Function GlobalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyW" (ByVal lpString1 As Long, ByVal lpString2 As Long) As Long

Public Sub SetClipboard(sUniText As String)
    Dim iStrPtr As Long
    Dim iLen As Long
    Dim iLock As Long
    Const GMEM_MOVEABLE As Long = &H2
    Const GMEM_ZEROINIT As Long = &H40
    Const CF_UNICODETEXT As Long = &HD
    OpenClipboard 0&
    EmptyClipboard
    iLen = LenB(sUniText) + 2&
    iStrPtr = GlobalAlloc(GMEM_MOVEABLE Or GMEM_ZEROINIT, iLen)
    iLock = GlobalLock(iStrPtr)
    lstrcpy iLock, StrPtr(sUniText)
    GlobalUnlock iStrPtr
    SetClipboardData CF_UNICODETEXT, iStrPtr
    CloseClipboard
End Sub

Public Function GetClipboard() As String
    Dim iStrPtr As Long
    Dim iLen As Long
    Dim iLock As Long
    Dim sUniText As String
    Const CF_UNICODETEXT As Long = 13&
    OpenClipboard 0&
    If IsClipboardFormatAvailable(CF_UNICODETEXT) Then
        iStrPtr = GetClipboardData(CF_UNICODETEXT)
        If iStrPtr Then
            iLock = GlobalLock(iStrPtr)
            iLen = GlobalSize(iStrPtr)
            sUniText = String$(iLen  2& - 1&, vbNullChar)
            lstrcpy StrPtr(sUniText), iLock
            GlobalUnlock iStrPtr
        End If
        GetClipboard = sUniText
    End If
    CloseClipboard
End Function

The above code can be called from a Custom Macro as follows:

Sub TestClipboard()
    Dim Val1 As String: Val1 = "Hello Clipboard " & vbLf & "World!"
    SetClipboard Val1
    MsgBox GetClipboard
End Sub

To Show a button on a form, you can find a good example by a quick serach. To show a button in the Excel Custom Ribbon (One that shows only in the current Excel workbook) you can use CustomUI.

CustomUI links:

https://bettersolutions.com/vba/ribbon/custom-ui-editor.htm

https://learn.microsoft.com/en-us/office/open-xml/how-to-add-custom-ui-to-a-spreadsheet-document

imageMSO List with Icons (Used in CustomUI):

https://bert-toolkit.com/imagemso-list.html

Thanks.

   Russkiy

04.01.12 — 14:47

Привет, ребята! Мне требуется помощь: нужно в коде макроса (Excel) задать процедуру копирования переменной в буфер обмена. Коротко: задаю значение переменной, а затем нужно каким-то образом заставить это значение перейти в буфер обмена. Как это сделать? Если кто в курсе, подскажите, пожалуйста.

   skunk

1 — 04.01.12 — 14:49

помещаешь значение в ячейку … выделяешь … копируешь

   Азат

2 — 04.01.12 — 14:49

нажимаешь «Начать запись макроса»

выполняешь все то, что тебе надо

Нажимаешь «остановить запись макроса»

Переходишь в VBA-окошко и получаешь вагон счастья

   Torquader

3 — 04.01.12 — 14:53

Для начала, нужно понять, что такое буфер обмена и какие форматы он поддерживает.

Потом, нужно осознать, что значение переменной должно быть представлено в одном из этих форматов, так как другого способа что-то записать в буфер обмена нет.

Ну а дальше, нужно найти объект, который управляет буфером обмена.

P.S. есть подозрение, что преобразование значения в текст и копирование текста в буфер обмена — самое оно.

   Russkiy

4 — 04.01.12 — 14:56

Нет, ребята, похоже, вы меня ещё не поняли. Вручную мне неинтересно — данных много, времени мало… Надо автоматически из кода копировать в буфер обмена. То, что вы предлагаете — попробуйте, получится ли? Ведь то, что я копирую в буфер обмена, мне из него же надо вставлять в другой программе, например, в 1С

   Russkiy

5 — 04.01.12 — 14:58

Да, конечно, я не против преобразования значения в текст и его копирования в буфер обмена. Вопрос в том, какой рагмент кода VBA может заставить комп это сделать?

   ДенисЧ

6 — 04.01.12 — 15:01

(5) выделяешь фрагмент и Selection.Copy

   Азат

7 — 04.01.12 — 15:01

(4) норм тебя поняли, читай ответы до просветления…

   Russkiy

8 — 04.01.12 — 15:02

Азат, я тут уже два часа просветляюсь именно тем способом, какой ты мне советуешь… Попробуй сам: получится у тебя?

   Torquader

9 — 04.01.12 — 15:05

Dim d as DataObject

d.SetText(«MyTextForBuffer»)

d.PutInClipboard

d.GetFromClipboard

MsgBox d.GetText,0,»Clipboard однако»

   skunk

10 — 04.01.12 — 15:06

не уловил зачем из кода что-то куда-то копировать

   Russkiy

11 — 04.01.12 — 15:08

Torquader, спасибо, ща попробую…

skunk, я копирую не из кода, а с помощью кода.

   Torquader

12 — 04.01.12 — 15:09

(11) Он копирует значение переменной, но он не сказал, откуда берётся это значение (подозреваю, что где-то оно уже есть, но не в переменной).

   Russkiy

13 — 04.01.12 — 15:15

Torquader, мой код до определённого места присваивает переменной некоторое значение из некоторой ячейки. А затем это значение мне нужно с помощью кода скопировать в буфер обмена. Вы, похоже, меня правильно понимаете.

Я попробовал использовать Ваш фрагмент кода, сделав модуль:

Sub Name()

Dim d As DataObject

d.SetText («MyTextForBuffer»)

d.PutInClipboard

d.GetFromClipboard

MsgBox d.GetText, 0, «Clipboard ??????»

End Sub

При попытке его отработать я получаю сообщение об ошибке:

«User-defined type not defined»

Что бы это значило?

   Torquader

14 — 04.01.12 — 15:19

А то, что я, как всегда, поспешил — объект-то создать надо.

Dim d as New DataObject

или как там в VBA пишется — целый год уже туда не заглядывал ^_^

   Russkiy

15 — 04.01.12 — 15:22

К сожалению, и слово New не помогает… Вываливается та же ошибка.

   skunk

16 — 04.01.12 — 15:23

подключить библиотеку fm20.dll из system32

   skunk

17 — 04.01.12 — 15:24

ну и нью нужно … иначе потом будет ошипка 91

   Russkiy

18 — 04.01.12 — 15:29

Я, к моему великому сожалению, чайник (хреново, мужики, быть чайником…). Поэтому мне хорошо бы узнать, как подключить эту библиотеку и что потом с ней делать, конкретно?

   skunk

19 — 04.01.12 — 15:34

заходишь в редактор кода … меню — tools->references … в диалоге кликаешь по кнопке browse … искаешь эту fm20.dll в папке system32 … открыть … в списке должно добавиться … макрософт формс 2.0 либрари объект … ставишь галочку(хотя она должна поставиться сама) … ок … радуешься

   skunk

20 — 04.01.12 — 15:39

   Russkiy

21 — 04.01.12 — 15:40

skunk, я всё сделал, как ты сказал. Спасибо тебе! Радуюсь, конечно, как не радоваться — прежде всего тому, что есть ещё у нас отзывчивые и добрые люди. Ага, пока писал — появилась твоя ссылка… Ща погляжу, чево там…

   Russkiy

22 — 04.01.12 — 15:42

Это о том, как подключить библиотеку… Я вроде бы это уже сделал. А что же дальше?

   Torquader

23 — 04.01.12 — 15:42

(22) Дальше должен работать код.

   skunk

24 — 04.01.12 — 15:44

а дальше исправляешь «Dim d As DataObject» на «Dim d As New DataObject» и код работает …

   Russkiy

25 — 04.01.12 — 15:46

Ага… Отлично, ща попробую… И отпишусь…

   Russkiy

26 — 04.01.12 — 15:48

Да, skunk, заработало! Спасибо тебе! Думаю, дальше я уж смогу разобраться… Спасибо всем, ребята! И с Новым годом вас!

   Torquader

27 — 04.01.12 — 15:53

А вообще, проще было задать вопрос google, так как он отвечает быстрее и без ошибок.

   sammmm

28 — 04.01.12 — 17:01

PutInClipboard  и тут ЕдРо

  

Torquader

29 — 04.01.12 — 17:11

(28) Ну вот, пришёл поручик и всё опошлил.

P.S. вам в другую тему.

Результат чтения текста из буфера обмена

Функции для работы с буфером обмена

(очистка буфера обмена, запись в буфер обмена, чтение из буфера обмена)

ВНИМАНИЕ: для работы функций требуется установка ссылки на библиотеку Microsoft Forms 2.0 Object Library:

Public Sub SetClipboard(Obj As Variant)
    Dim MyDataObj As New DataObject
    MyDataObj.SetText Format(Obj)
    MyDataObj.PutInClipboard
End Sub
 
Public Sub SetTextIntoClipboard(ByVal txt As String)
    Dim MyDataObj As New DataObject
    MyDataObj.SetText txt
    MyDataObj.PutInClipboard
End Sub
 
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

Аналогичная функция ClipboardText (чтение текста из буфера обмена), но не требующая подключения библиотеки:

Sub ПримерИспользования()
    txt = ClipboardText
    MsgBox txt, vbInformation, "Содержимое буфера обмена Windows"
End Sub
 
Function ClipboardText() ' чтение из буфера обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .GetFromClipboard
        ClipboardText = .GetText
    End With
End Function
 
Sub SetClipboardText(ByVal txt$) ' запись в буфер обмена
    With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
        .SetText txt$
        .PutInClipboard
    End With
End Sub
  • 68174 просмотра

Не получается применить макрос? Не удаётся изменить код под свои нужды?

Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.

Понравилась статья? Поделить с друзьями:
  • Vba excel переменная эта книга
  • Vba excel пароль на код
  • Vba excel переменная строка
  • Vba excel пароль на ввод
  • Vba excel переменная как текст