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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

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

Сообщение ZlydenGL » 12.11.2004 (Пт) 19:33

Всем привет!

Есть следующая задача - есть огромный двухмерный массив (по высоте :) ) и есть у меня желание его в определенный момент напрямую в буфер обмена запихнуть - допустим чтобы в Excel вставить. То есть каждый элемент должен быть разделен чем-то вроде vbTab'ом, каждая строка отделена от следующей vbNewLine'ом.

Естественно массив отвечает требованиям того же Excel'я: число строк меньше 65536, число столбцов меньше 256.

В общем желание есть, а вот возможности подкачали :evil: Вроде бы даже поиском по форуму прошелся - ответа не нашел. HELP!!! :oops:

Заранее спасибо!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 12.11.2004 (Пт) 20:11

Следующий код скопирует в буфер обмена 10 столбцов по 10 ячеек в каждом.. Можно вставить в excel и посмотреть на результат

Код: Выделить всё
  Dim astrBuffer(10, 10) As String
  Dim lngRow As Long
  Dim lngColumn As Long
 
  '//Создадим массив
  For lngRow = 0 To 10
    For lngColumn = 0 To 10
      astrBuffer(lngColumn, lngRow) = CStr(Rnd)
    Next lngColumn
  Next lngRow
  '//
 
  '//Создадим приемлемый формат данных для офиса и скопируем в буфер обмена
  '//
  '//офис умеет хранить данные в множестве различных форматов
  '//вот самый простой:
  '//ЯЧЕЙКА_1->TAB->ЯЧЕЙКА_2->TAB->ЯЧЕЙКА_N->CRLF_1->ЯЧЕЙКА_1->TAB->ЯЧЕЙКА_2->TAB->ЯЧЕЙКА_N->CRLF_N
  Dim astrImage As String
 
  For lngRow = 0 To 10
    For lngColumn = 0 To 10
      '//Чтобы не было лишней колонки, выполним простую проверку
      If (lngColumn < 10) Then
        astrImage = astrImage & astrBuffer(lngColumn, lngRow) & vbTab
      Else
        astrImage = astrImage & astrBuffer(lngColumn, lngRow)
      End If
      '//
    Next lngColumn
   
    astrImage = astrImage & vbCrLf
  Next lngRow
 
  Clipboard.SetText astrImage
  '//


Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 12.11.2004 (Пт) 20:48

А разве на длину строки не накладывается ограничение в 255 символов? Понятно, что с матрицей 10х10 код прокатит. А для допустим 256х13? Надо будет попробовать...
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 12.11.2004 (Пт) 21:11

Какое ограничение в 255 символов?! Это ты откуда взял :lol:?
Пробуй, все будет замечательно работать.

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 15.11.2004 (Пн) 11:06

Это ограничение было в старых версиях бейсика (BASICA, GWBASIC). Даже в QBasic и Quick Basic было какое-то (то ли 255, то ли 1024).
Lasciate ogni speranza, voi ch'entrate.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 15.11.2004 (Пн) 19:17

FTR, в QB - 32767 символов.
И даже афаик в gwbasic так.

А вот basica, увы, не сохранился - проверить как там, не могу. Но "по косвенным данным" - 255.
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.11.2004 (Вт) 10:50

Каюсь, в QB строка может быть до 32767 символов.
Но в GW-BASIC она точно не более 255.
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 16.11.2004 (Вт) 11:02

Каюсь, в QB строка может быть до 32767 символов.
Но в GW-BASIC она точно не более 255.


В VB6 тоже есть еще оно ограничение на длину строки - кода - в модуле. Сколько символов не помню точно - проверять и уточнять влом, да и неинтересно...

Но вообще копирование массива в буфер для последующей вставки в Excel - не очень хорошее решение, так как простое копирование с разделением vbTab не дает Excel-у возможности однозначно определить тип поля (число/строка/дата). Лучше делать нормальный экспорт из программы - оно ненамного сложней...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

mnzol
Новичок
Новичок
 
Сообщения: 34
Зарегистрирован: 29.09.2004 (Ср) 11:02

Сообщение mnzol » 16.11.2004 (Вт) 12:41

Если не обязательно в буфер, то самый лучший способ

dim DataArray(1 to 10000, 1 to 5) as ......
...
...

Worksheets(1).Range("A1").value = DataArray

Работает также быстро как Paste!
Про это отличная статейка у Билла Q247412

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 25.11.2004 (Чт) 12:03

mnzol, вообще не работает! Твоя конструкция вылетает с ошибкой. Может, это с величиной массива связано?

xolod, будешь смеяться - не хватает :-( У меня получается выгрузка в Ёксель размером 12х20000, в строку не помещается - хоть тресни :-(
Последний раз редактировалось ZlydenGL 25.11.2004 (Чт) 12:09, всего редактировалось 1 раз.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.11.2004 (Чт) 12:09

ZlydenGL, должно работать. Какая у тебя версия Excel? И какой тип массива DataArray? Попробуй объявить его, как Variant.
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 25.11.2004 (Чт) 12:15

Комплект M$ Office 2000, DataVal у меня типа Variant как раз.

Команда следующая:
Код: Выделить всё
Dim xlsapp As Excel.Application, DataVal()
...
xlsapp.Activeworkbook.Worksheets("Bal1").Range("C1") = DataVal

Сейчас ошибка не вылетает почему-то, но и в Ёксель ничего не постится, он у меня перед глазами.

Добавлено чуть позже
О, а может быть дело в том, что у меня возможны случаи, когда в первой строке массива пустые значения? Я тестю именно такой вариант кстати.
Последний раз редактировалось ZlydenGL 25.11.2004 (Чт) 12:25, всего редактировалось 1 раз.
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.11.2004 (Чт) 12:25

Проверил, все работает.
Попробуй .Range("C1:G20000").Value = DataVal()
Lasciate ogni speranza, voi ch'entrate.

ZlydenGL
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 148
Зарегистрирован: 13.08.2004 (Пт) 10:02

Сообщение ZlydenGL » 25.11.2004 (Чт) 12:29

Ага, так работает! Отлично, СПАСИБО БОЛЬШОЕ!!!
Покой нам только снится!!! И то редко. Поскольку нет в мире совершенства, а есть только стремление к оному.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot и гости: 7

    TopList  
cron