powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как вставить rtf строку с помощью VBA
19 сообщений из 19, страница 1 из 1
как вставить rtf строку с помощью VBA
    #36237702
MaxBod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
Есть строка, которая содержит rtf текст
"{\rtf1\ansi\ansicpg1251\deff0\deflang1049{\fonttbl{\f0\fswiss\fcharset204{\*\fname Arial;}Arial CYR;}}
{\colortbl ;\red0\green128\blue0;}
{\*\generator Msftedit 5.41.21.2500;}\viewkind4\uc1\pard\f0\fs20\'cf\'f0\'e8\'e2\'e5\'f2 \cf1\'ec\'e8\'f0\cf0\par
}"
Как с помощью VBA встатить эту строку в word, что б в документе написалось
Привет мир
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36237770
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Через буфер только.

Jah loves you.
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36239624
MaxBod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, а не подскажите, где можно посмотреть подробнее?
И наверное HTML строку можно добавить так же?
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36239747
Фотография by-pass
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Clipboard
Код: plaintext
1.
2.
3.
Sub SetText(Str As String, [Format])
    Member of VB.Clipboard
    Puts a text string on the Clipboard object using the specified Clipboard object format.
Код: plaintext
1.
2.
3.
Function GetText([Format]) As String
    Member of VB.Clipboard
    Returns a text string from the Clipboard object.
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36239828
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В VBA нет объекта Clipboard, только через API. Сам я этим не занимался, но не раз видел обсуждения, го в поиск.

Jah loves you.
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36239973
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насчёт Clipboard в VBA. Может кому пригодится - комплект для работы с буфером - выкладываю, как в рабочем файле:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
'Option Compare Database
Option Explicit

'am 030305_14:59:26  --begin-- **************
'так как проблема при копировании в буфер тектста
    'в юникода при латинской раскладке
Private Declare Function GetKeyboardLayoutName Lib "user32" _
        Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As Long
Private Declare Function LoadKeyboardLayout Lib "user32" _
        Alias "LoadKeyboardLayoutA" (ByVal HKL As String, _
                ByVal flags As Long) As Long
Private Const KL_NAMELENGTH =  9 
'am 030305_14:59:26  --end-- **************


Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "user32" () As Long
Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" _
            (ByVal wFlags&, ByVal dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, _
            ByVal lpString2 As Any) As Long
Declare Function lstrcpy2 Lib "kernel32" Alias "lstrcpy" _
        (ByVal lpString1 As Any, ByRef lpString2 As Byte) As Long
Declare Function EmptyClipboard Lib "user32" () As Long
Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, _
            ByVal hMem As Long) As Long

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

 Function ClipBoard_GetData() As String
         Dim hClipMemory As Long
         Dim lpClipMemory As Long
         Dim MyString As String
         Dim RetVal As Long
         Dim lSize As Long
         If OpenClipboard( 0 &) =  0  Then
            MsgBox "Cannot open Clipboard. Another app. may have it open"
            Exit Function
         End If

         ' Obtain the handle to the global memory
         ' block that is referencing the text.
         hClipMemory = GetClipboardData(CF_TEXT)
         If hClipMemory =  0  Then
            MsgBox "Could not allocate memory"
            GoTo OutOfHere
         End If
         'am 040610 - размер нужно узнать
          lSize = GlobalSize(hClipMemory)

         ' Lock Clipboard memory so we can reference
         ' the actual data string.
         lpClipMemory = GlobalLock(hClipMemory)

         If lpClipMemory <>  0  Then
            MyString = Space$(lSize)
            RetVal = lstrcpy(MyString, lpClipMemory)
            RetVal = GlobalUnlock(hClipMemory)

            ' Peel off the null terminating character.
            MyString = Mid(MyString,  1 , InStr( 1 , MyString, Chr$( 0 ),  0 ) -  1 )
         Else
            MsgBox "Could not lock memory to copy string from."
         End If

OutOfHere:

         RetVal = CloseClipboard()
         ClipBoard_GetData = MyString

      End Function


Function ClipBoard_SetData(MyString As String)
         Dim hGlobalMemory As Long, lpGlobalMemory As Long
         Dim hClipMemory As Long, x As Long

         ' Allocate movable 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)
         'lpGlobalMemory = lstrcpy2(lpGlobalMemory, b(0))

         ' 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()


        'am 030305_15:16:05  --begin-- **************
        'переключаемся на русскую раскладку чтобы не иметь
        'проблем с русским текстом в буфере
        '(некорректно понимается кодовая страница)
        Dim sOldLang As String
        sOldLang = switchLang("00000419")
        'am 030305_15:16:05  --end-- **************

         ' Copy the data to the Clipboard.
         hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
OutOfHere2:
         If CloseClipboard() =  0  Then
            MsgBox "Could not close Clipboard."
         End If
        'am 030305_15:17:26  --begin-- **************
        'возвращаем раскладку на место
        If Len(sOldLang) >  0  Then _
            sOldLang = switchLang(sOldLang)
        'am 030305_15:17:26  --end-- **************

End Function
        
Private Function getCurrLang() As String
    Dim layoutname As String * KL_NAMELENGTH
    Dim z As Long
    z = GetKeyboardLayoutName(layoutname)
    If z =  0  Then
        getCurrLang = ""
    Else
        getCurrLang = StrZ(layoutname)
    End If
End Function
'Переключает на указанную sNewLang раскладку - возвращает старую раскладку
'am 030305_15:13:39
Private Function switchLang(sNewLang As String) As String
'"00000419" - русская
'"00000409" - латинская
    switchLang = getCurrLang
    If StrComp(switchLang, sNewLang) <>  0  Then
        LoadKeyboardLayout sNewLang,  1 
    End If
End Function
'v_1.0.0 990630
Public Function StrZ(par As String) As String
Dim nSize As Long, i As Long, Rez As String
   nSize = Len(par)
   i = InStr( 1 , par, Chr( 0 )) -  1 
   If i > nSize Then i = nSize
   If i <  0  Then i = nSize
   StrZ = Mid(par,  1 , i)
End Function


И вдобавок код по установке/снятию автофильтра, который данные берёт из буфера (оба эти блока в одном модуле):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Sub setfilter()
Dim crdn As String
Dim r As String
Dim ac_row As String

With Application
    .ScreenUpdating = False
 ac_row = CStr(ActiveCell.Row)
 nmb = ClipBoard_GetData
         If nmb = "" Then
            GoTo OutOfHere4
         End If

nmb = Left(nmb,  10 )

    Columns("D:D").Select
    Range("D2").Activate
    Selection.AutoFilter Field:= 1 , Criteria1:=nmb

ActiveWindow.SmallScroll Down:=- 15000 

Cells(ac_row,  4 ).Activate
Cells(ac_row,  4 ).Select

OutOfHere4:
   .ScreenUpdating = True
 End With
End Sub


Где взял код по обработке буфера, не помню, можно поискать по фрагментам кода, сейчас попробовал - нашёл нечто родственное:
http://hiprog.com/index.php?option=com_content&task=view&id=205&Itemid=34
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #36243407
Фотография Serge Gavrilov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,

ну почему только через буфер.
Можно сохранить строку в файл и вставить этот файл в документ Word
selection.InsertFile("C:\test\file.rtf")
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
как вставить rtf строку с помощью VBA
    #39479380
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поднимем тему :)

Очень нужно вставить RTF-текст из буфера обмена в RichTextBox.
Собственно, для этого надо вытащить из буфера текст вместе с RTF-кодами...

Hugo121, ваша функция ClipBoard_GetData() работает, но она вытаскивает из буфера обмена голый текст, а надо бы RTF...

Кто может помочь?
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479391
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понял, за тип вставляемого содержимого отвечает строка:
Public Const CF_TEXT = 1
здесь 1 определяет, что отдаётся текстовый тип, то есть голый текст.
А вот что надо, чтобы из клипборда был выбран кусок с RTF - не могу найти, не вижу RTF в MSDN в списке Registered Clipboard Formats...
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479413
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
 CF_LOCALE16 
The data is a handle to the locale identifier associated with text in the clipboard. When you close the clipboard, if it contains CF_TEXT data but no CF_LOCALE data, the system automatically sets the CF_LOCALE format to the current input language. You can use the CF_LOCALE format to associate a different locale with the clipboard text. 

An application that pastes text from the clipboard can retrieve this format to determine which character set was used to generate the text.

Note that the clipboard does not support plain text in multiple character sets. To achieve this, use a formatted text data type such as RTF instead.

The system uses the code page associated with CF_LOCALE to implicitly convert from CF_TEXT to CF_UNICODETEXT. Therefore, the correct code page table is used for the conversion.


попробуйте
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479441
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, и какое это имеет отношение к вопросу темы - к вставке RTF?
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479568
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А где гарантия что в буфере rtf-код, а не простой текст?
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479616
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kukshaHandKot, и какое это имеет отношение к вопросу темы - к вставке RTF?
просто предположил
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479619
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Antonariy, гарантия та, что я останавливаю отладчик до и после ClipBoard_GetData и в другом окне по Ctrl+V получаю вполне красивый RTF, а не просто голый текст.
RTF я получаю из вордового документа через Selection.Copy
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479622
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HandKot, в смысле 16 попробовать? Да я вроде стандартные все перебрал...
Если только зарегистрировать свой тип данных CF_RTF и сделать свою процедуру копирования под этим типом в клипборд. Но во-первых для меня это сложно, а во-вторых, как я уже написал выше - в клипборде уже есть RTF, что подтверждается успешной вставкой через клавиатуру...
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479684
kuksha,

быстро-грязно:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
Option Explicit

Private Enum BOOL
   FALSE_BOOL = 0&
   TRUE_BOOL = 1&
End Enum
Private Declare Function OpenClipboard Lib "user32" (Optional ByVal hWnd As Long = 0&) As BOOL
Private Declare Function CloseClipboard Lib "user32" () As BOOL
Private Declare Function GetClipboardData Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function EnumClipboardFormats Lib "user32" (ByVal wFormat As Long) As Long
Private Declare Function GetClipboardFormatNameW Lib "user32" ( _
   ByVal wFormat As Long, ByVal lpszFormatName As Long, ByVal cchMaxCount As Long) As Long
Private Const ERROR_INVALID_PARAMETER = 87

Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
   Destination As Any, Source As Any, ByVal Length As Long)


Public Sub Test()
 If OpenClipboard = FALSE_BOOL Then
    MsgBox "Cannot open Clipboard. Another app. may have it open"
    Exit Sub
 End If

 Dim uFormat As Long
 Do
    uFormat = EnumClipboardFormats(uFormat)
    If uFormat = 0 Then Exit Do
 
    Dim lResult As Long
    Dim sFormatName As String
    Dim lSize As Long
    lSize = 64
    sFormatName = String$(lSize, 0)
    lResult = GetClipboardFormatNameW(uFormat, StrPtr(sFormatName), lSize)
    If lResult = 0 Then
       Select Case Err.LastDllError
       Case ERROR_INVALID_PARAMETER
          sFormatName = "Predefined Format (CF_) " & uFormat
       Case Else
          sFormatName = "ERROR"
       End Select
    Else
       sFormatName = Left$(sFormatName, lResult)
    End If
    Debug.Print sFormatName
    
    If sFormatName = "Rich Text Format" Then
       Debug.Print GetClipboardRichText(uFormat)
    End If
 Loop
 
 CloseClipboard
End Sub

Private Function GetClipboardRichText(ByVal uFormat As Long) As String
 Dim hClipMemory  As Long
 hClipMemory = GetClipboardData(uFormat)
 If hClipMemory = 0 Then
    Debug.Print "Could not allocate memory"
    Exit Function
 End If
 
 Dim lSize As Long
 lSize = GlobalSize(hClipMemory)
 ReDim bBuffer(0 To lSize - 1) As Byte

 Dim lpClipMemory As Long
 lpClipMemory = GlobalLock(hClipMemory)

 If lpClipMemory <> 0 Then
    CopyMemory bBuffer(0), ByVal lpClipMemory, lSize
    GlobalUnlock hClipMemory
    GetClipboardRichText = StrConv(bBuffer, vbUnicode)
 End If
End Function
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479876
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал, спасибо, видимо классная вещь, но что-то не разберусь никак как её использовать...
откуда тут RTF-то вытаскивается и в каком виде куда запихивается?
Что-то не осилю никак...
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39479913
kuksha,

откуда - из Clipboard-а, по условиям задачи;
в каком виде - в виде строки в формате RTF;
куда - в примере - в окно отладочного вывода. В переносе на RichTextBox приёмником скорее всего должны быть свойства SelRTF или TextRTF, например,
Код: vbnet
1.
RichTextBox1.SelRTF = GetClipboardRichText(uFormat) 'замена выделенного в RTB фрагмента отформатированным текстом из буфера обмена
...
Рейтинг: 0 / 0
как вставить rtf строку с помощью VBA
    #39480030
kuksha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
13-й квартал, СПАСИБО ОГРОМНОЕ!!!!
Это работает! Вы мастер, снимаю шляпу... где я только ни спрашивал...
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / как вставить rtf строку с помощью VBA
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]