Проверьте содержимое буфера обмена перед вставкой - PullRequest
3 голосов
/ 09 сентября 2011

Можно ли проверить содержимое буфера обмена перед его вставкой в ​​Excel VBA

У меня есть сегодня:

Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
ActiveSheet.Paste                        ' Paste from Clipboard
IsMultiLevel = (InStr(Range("A1"), "Multi-Level") > 0) ' Determine type of report
If Not IsMultiLevel Then
    MsgBox ("ERROR in Clipboard Data!!")
    End
Else
    ActiveSheet.Delete
End If

Но я хочу проверить данные перед добавлением нового листа, затем мне не нужно их удалять .. Я хочу что-то подобное

IsMultiLevel = (InStr([CLIPBOARD], "Multi-Level") > 0) ' Determine type of report
If Not IsMultiLevel Then
    MsgBox ("ERROR in Clipboard Data!!")
    End
End If
Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
ActiveSheet.Paste                        ' Paste from Clipboard

Ответы [ 3 ]

3 голосов
/ 12 сентября 2011

Исходя из Excel 2003 Я должен сказать, что можно изучить содержимое буфера обмена, используя MSForms.DataObject.Сначала вы должны создать ссылку (окно инструментов VBA / ссылку) на библиотеку объектов Microsoft Forms 2.0 (обычно находится в ... \ system32 \ FM20.DLL).

Затем вы можете прочитать буфер обмена втекстовая переменная:

Dim BufObj As MSForms.DataObject, BufTxt as String

Set BufObj = New MSForms.DataObject
BufObj.GetFromClipboard
BufTxt = Buf.GetText

Текст буфера останется нетронутым (по крайней мере, в Win XP / SP3, MS Office 2003 SP 3) и доступен для дальнейшего использования, то есть GetFromClipboard не разрушит буфер обменабуфер.Здесь необходимо учитывать, что содержимое буфера обмена доступно «в виде текста», поэтому любая графика будет храниться в режиме необработанного текста.Также необходимо учитывать размер буфера, поскольку строка переменной длины в Excel может содержать не более ca.2 ^ 31 символов (но ИМХО этого должно хватить для 90% всех потребностей).

2 голосов
/ 12 сентября 2011

Большое спасибо, ребята ..!Ты великолепен!Я просто хотел поделиться с вами своим решением.

Function GetClipboardText(nChars As Integer) As String
    Dim BufObj As MSForms.DataObject
    Set BufObj = New MSForms.DataObject
    BufObj.GetFromClipboard
    GetClipboardText = Left(BufObj.GetText, nChars) ' Get only first nChars
End Function

Sub CreateOverviewSheet()
' Determine type of report in Clipboard
    IsMultiLevel = (InStr(GetClipboardText(100), "Multi-Level") > 0)
    IsConsolidated = (InStr(GetClipboardText(100), "Consolidated") > 0)
    If Not IsMultiLevel Or IsConsolidated Then
        MsgBox ("ERROR in Clipboard Data!!")
        End
    End If
    Sheets.Add After:=Sheets(Sheets.Count)   ' Create new sheet
    ActiveSheet.Paste                        ' Paste from Clipboard
    .
    .  and so on...
    .
End Sub
1 голос
/ 11 сентября 2011

Пожалуйста, поймите, что невозможно просмотреть содержимое буфера обмена (кроме изучения списка доступных форматов), не мешая другим приложениям. Если приложение, которое поместило данные в буфер обмена, использует отложенную визуализацию, вы вызовете событие, которое не может быть отменено (приложение будет вынуждено произвести данные и будет ожидать, что пользователь вставил данные). Это также будет иметь значение для синхронизации буфера обмена через сетевые подключения, например, с помощью удаленного рабочего стола. И любой из моих пользователей (ClipMate) будет весьма раздражен вами и, вероятно, добавит вас к «стене позора» приложений, которые деструктивно предварительно просматривают данные буфера обмена: http://www.thornsoft.com/faq/index.php?action=artikel&cat=9&id=79

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...