Мне понадобилось, чтобы процедура работала с ДИАПАЗОНОМ/ЯЧЕЙКОЙ, помещёнными в буфер пользователем. Если буфер пуст или там не диапазон, то выйти. Что-то я не соображу, как программно выяснить, что находится в буфере обмена? Сбросился (пустой)? А если не пустой, то что в нём? Диапазон? Текст? Диаграмма? Рисунок? и т.д.?
Мне понадобилось, чтобы процедура работала с ДИАПАЗОНОМ/ЯЧЕЙКОЙ, помещёнными в буфер пользователем. Если буфер пуст или там не диапазон, то выйти. Что-то я не соображу, как программно выяснить, что находится в буфере обмена? Сбросился (пустой)? А если не пустой, то что в нём? Диапазон? Текст? Диаграмма? Рисунок? и т.д.?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 07.05.2013, 09:05
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
[/vba]
Alex_ST, [vba]
Код
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
Что-то там накручено в Application.ClipboardFormats Вроде бы возвращается одномерный массив целых значений... И даже приведён список возможных значений. Накатал процедурку:[vba]
Код
Sub test_ClipboardFormats() Dim aFmt For Each aFmt In Application.ClipboardFormats Debug.Print aFmt Next End Sub
[/vba] Анализировал ответы в Immediate с разными скопированными в буфер объектами. Высянил, что в списке нет очень многих возвращаемых процедурой значений Так и не понял, как из этого массива понять, диапазон в буфере или нет?
Что-то там накручено в Application.ClipboardFormats Вроде бы возвращается одномерный массив целых значений... И даже приведён список возможных значений. Накатал процедурку:[vba]
Код
Sub test_ClipboardFormats() Dim aFmt For Each aFmt In Application.ClipboardFormats Debug.Print aFmt Next End Sub
[/vba] Анализировал ответы в Immediate с разными скопированными в буфер объектами. Высянил, что в списке нет очень многих возвращаемых процедурой значений Так и не понял, как из этого массива понять, диапазон в буфере или нет?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 07.05.2013, 11:43
И что дальше? Матраскин, прекращайте флуд. Учитесь признавать свои ошибки, вызванные неумением внимательно читать чужие посты. Посмотрите внимательно на время создания и редактирования старт-топика: Я НИЧЕГО в нём не исправлял - ни текста, ни заголовка темы, ни пояснения. Разве я хоть словом там обмолвился о том, что мне нужен текст из буфера обмена? Речь везде шла именно о типе данных. Или Вы принципиально до конца не дочитываете ни заголовки, ни топики?
И что дальше? Матраскин, прекращайте флуд. Учитесь признавать свои ошибки, вызванные неумением внимательно читать чужие посты. Посмотрите внимательно на время создания и редактирования старт-топика: Я НИЧЕГО в нём не исправлял - ни текста, ни заголовка темы, ни пояснения. Разве я хоть словом там обмолвился о том, что мне нужен текст из буфера обмена? Речь везде шла именно о типе данных. Или Вы принципиально до конца не дочитываете ни заголовки, ни топики?Alex_ST
Сильно не копался, но предполагаю что функция [vba]
Код
Private Declare Function GetClipboardData Lib "user32" _ (ByVal uFormat As Long) As Long
[/vba] Возвращает указатель на объект который хранится в буфере обмена, а уже как с ним обращаться, зависит от того что возвратит
[vba]
Код
Private Declare Function IsClipboardFormatAvailable Lib "user32" _ (ByVal uFormat As Long) As Long
[/vba] и вот уже на основании этих данных и выдёргивать из буфера обмена через GetClipboardData в нужном формате там в Related: ссылка на DragQueryFile: Identify Files Copied to the Clipboard в котором расписано как можно выдернуть из буфера обмена список файлов скопированных в Проводнике
Цитата (ikki)
честно - не проверял ни в одном глазу.
Сильно не копался, но предполагаю что функция [vba]
Код
Private Declare Function GetClipboardData Lib "user32" _ (ByVal uFormat As Long) As Long
[/vba] Возвращает указатель на объект который хранится в буфере обмена, а уже как с ним обращаться, зависит от того что возвратит
[vba]
Код
Private Declare Function IsClipboardFormatAvailable Lib "user32" _ (ByVal uFormat As Long) As Long
[/vba] и вот уже на основании этих данных и выдёргивать из буфера обмена через GetClipboardData в нужном формате там в Related: ссылка на DragQueryFile: Identify Files Copied to the Clipboard в котором расписано как можно выдернуть из буфера обмена список файлов скопированных в ПроводникеM73568
Сообщение отредактировал M73568 - Среда, 08.05.2013, 16:34
Так как скопированные ячейки многосложный объект, хранящий в себе кучу инфы, то функция GetClipboardFormatName и возвращает кучу типов (у меня около 30) вне зависимости от количества ячеек
Так как скопированные ячейки многосложный объект, хранящий в себе кучу инфы, то функция GetClipboardFormatName и возвращает кучу типов (у меня около 30) вне зависимости от количества ячеекM73568
Спасибо за предупреждение. WinAPI к стыду моему - не для меня Ну не понимаю я их. А использовать что-то, не понимая как это работает, а просто тупо копируя откуда-то я очень не люблю. Может быть попытаться с другой стороны к задаче подойти? Не узнавать тип объекта в буфере, а узнавать, является ли объект в буфере диапазоном? Ну, т.е., например, что-то типа этого: [vba]
Код
Dim rRng As Range On Error Resume Next Set rRng = ' а вот тут как раз и засада: как из буфера обмена что-то запихнуть в переменную чтобы выяснить, "подходит ли размер"? If Err Then Exit Sub
[/vba]
Цитата (ikki)
но предупреждаю - это WinAPI
Спасибо за предупреждение. WinAPI к стыду моему - не для меня Ну не понимаю я их. А использовать что-то, не понимая как это работает, а просто тупо копируя откуда-то я очень не люблю. Может быть попытаться с другой стороны к задаче подойти? Не узнавать тип объекта в буфере, а узнавать, является ли объект в буфере диапазоном? Ну, т.е., например, что-то типа этого: [vba]
Код
Dim rRng As Range On Error Resume Next Set rRng = ' а вот тут как раз и засада: как из буфера обмена что-то запихнуть в переменную чтобы выяснить, "подходит ли размер"? If Err Then Exit Sub
Привет Вариант как узнать диапазон в буфере или нет Не совсем уверен или подойдёт такое решение
[vba]
Код
Sub tt_() On Error Resume Next Dim txt$, i&, lCount& Dim splTmp1$(), splTmp2$() txt = ClipboardText
splTmp1 = Split(Application.Trim(txt), Chr(13) & Chr(10)) For i = 0 To UBound(splTmp1) If InStr(splTmp1(i), Chr(9)) Then splTmp2 = Split(splTmp1(i), Chr(9)) lCount = lCount + (UBound(splTmp2) + 1) End If Next If lCount = 0 Then lCount = UBound(splTmp1)
If lCount <= 0 Then MsgBox "В буфере ничего НЕТ" If lCount = 1 Then MsgBox "В буфере НЕ массив" If lCount > 1 Then MsgBox "В буфере массив" Debug.Print lCount End Sub
Function ClipboardText() With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .GetFromClipboard ClipboardText = .GetText End With End Function
[/vba]
Привет Вариант как узнать диапазон в буфере или нет Не совсем уверен или подойдёт такое решение
[vba]
Код
Sub tt_() On Error Resume Next Dim txt$, i&, lCount& Dim splTmp1$(), splTmp2$() txt = ClipboardText
splTmp1 = Split(Application.Trim(txt), Chr(13) & Chr(10)) For i = 0 To UBound(splTmp1) If InStr(splTmp1(i), Chr(9)) Then splTmp2 = Split(splTmp1(i), Chr(9)) lCount = lCount + (UBound(splTmp2) + 1) End If Next If lCount = 0 Then lCount = UBound(splTmp1)
If lCount <= 0 Then MsgBox "В буфере ничего НЕТ" If lCount = 1 Then MsgBox "В буфере НЕ массив" If lCount > 1 Then MsgBox "В буфере массив" Debug.Print lCount End Sub
Function ClipboardText() With GetObject("New:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}") .GetFromClipboard ClipboardText = .GetText End With End Function
Ребята, спасибо за предложенные варианты. К сожалению, сейчас на работе полный завал делами, очень далёкими от Excel'я... Пробовать что-то совсем некогда. Но при простом просмотре что-то мне кажется, что достоверность обоих вами предложенных методов достаточно низка. Ведь если использовать метод Богдана, то ведь в буфере обмена вполне может быть и обычный текст, слова которого разделены CR-LF'ами. А у Сашиного метода если в буфере опять же просто текст, то он прекрасно вставится в одну ячейку или диапазон, если там были CR-LF'ы. И что? Или я что-то проглядел/не понял? Действительно, наверное, нужно создавать новую книгу. А вот вставлять в её активную ячейку что-то, характерное только для диапазонов, используя PasteSpecial Ну, например, ширину столбца - xlPasteColumnWidths или просто формат - xlPasteFormats Тогда, если будет ошибка (обработчик, естественно, должен быть включен), то значит в буфере был не диапазон, а если ошибки при спец.вставке не будет, то диапазон. Как вам такой алгоритм? Какие видны подводные камни? Я, к сожалению, проверить на работе смогу не скоро. А тогда забудется.
Ребята, спасибо за предложенные варианты. К сожалению, сейчас на работе полный завал делами, очень далёкими от Excel'я... Пробовать что-то совсем некогда. Но при простом просмотре что-то мне кажется, что достоверность обоих вами предложенных методов достаточно низка. Ведь если использовать метод Богдана, то ведь в буфере обмена вполне может быть и обычный текст, слова которого разделены CR-LF'ами. А у Сашиного метода если в буфере опять же просто текст, то он прекрасно вставится в одну ячейку или диапазон, если там были CR-LF'ы. И что? Или я что-то проглядел/не понял? Действительно, наверное, нужно создавать новую книгу. А вот вставлять в её активную ячейку что-то, характерное только для диапазонов, используя PasteSpecial Ну, например, ширину столбца - xlPasteColumnWidths или просто формат - xlPasteFormats Тогда, если будет ошибка (обработчик, естественно, должен быть включен), то значит в буфере был не диапазон, а если ошибки при спец.вставке не будет, то диапазон. Как вам такой алгоритм? Какие видны подводные камни? Я, к сожалению, проверить на работе смогу не скоро. А тогда забудется.Alex_ST
я предложил чисто идею - чтобы понять что в буфере, его надо "выплюнуть" на лист, а уж что ты там ищешь конкретно - это нюансы. я копировал таблицу из браузера и полностью управлял тем моим кодом момент и качество вставки - через временный лист...
я предложил чисто идею - чтобы понять что в буфере, его надо "выплюнуть" на лист, а уж что ты там ищешь конкретно - это нюансы. я копировал таблицу из браузера и полностью управлял тем моим кодом момент и качество вставки - через временный лист...Саня
По опыту вставки данных ячеек из Excel в Surfer могу сказать, что можно проверять скопированы ли ячейки по наличию одного из кодов для xlClipboardFormatBIFF, +xlClipboardFormatSYLK +xlClipboardFormatCSV +xlClipboardFormatText
По опыту вставки данных ячеек из Excel в Surfer могу сказать, что можно проверять скопированы ли ячейки по наличию одного из кодов для xlClipboardFormatBIFF, +xlClipboardFormatSYLK +xlClipboardFormatCSV +xlClipboardFormatTextanvg