Данные из VB через буфер обмена в Excel

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Данные из VB через буфер обмена в Excel

Сообщение retiv » 10.04.2003 (Чт) 9:37

Привет!
Из грида своей программы хочу перекидывать данные через буфер обмена в Excel. Схематично код выглядит так:

Dim sTotal As String
Dim sRow As String
sTotal = ""
For Each ir In grid.Rows
sRow = ""
For Each ic In grid.Columns
sRow = sRow + ToString(grid.Value(ir, ic)) + Chr(vbKeyTab)
Next ic
sTotal = sTotal + sRow + Chr(vbKeyReturn)
Next ir
Clipboard.SetText sTotal

Public Function ToString(ByVal v As Variant) As String
If IsDate(v) Then
ToString = Format(v, "dd/mm/yyyy")
Exit Function
End If
If IsNumeric(v) Then
ToString = Str(v)
Exit Function
End If
If TypeName(v) = "String" Then
ToString = v
Exit Function
End If
ToString = ""
Exit Function
End Function

Т.е. я каждое значение ячейки грида перевожу в строку и отделяю их друг от друга табуляцией

Проблемы:
При конвертировании вещественных чисел в строку (функция Str) в качестве разделителя используется точка. Русские версии Excel точку как разделитель не понимают и считают что это не число, а строка или дата.
Даты в свою очередь тоже не всегда воспринимаются датами.

Вопрос:
В буфер обмена передавать информацию о типе значений?
Какие способы решения этой проблемы существуют?

Спасибо

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2003 (Чт) 9:49

Юзай функцию Format
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 9:59

Если повнимательнее посмотреть на код первого письма то можно увидеть что совет: "Юзай функцию Format" уже выполнен. Можно чуть конкретнее?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2003 (Чт) 10:05

Действие А:
? Str(4.5) :arrow: 4.5

Действие Б
? Format(4.5) :arrow: 4,5


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

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 10:34

Спасибо.
Наверное поможет.

Но вопрос шире: могу ли я указать тип данных для каждого значения в буфере обмена?

Описаны ли где-нибудь правила по которым Excel конвертирует тектстовые данные? Может надежнее передавать без конвертации в строку?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.04.2003 (Чт) 10:54

Да ненужно это :)
Функция Format учитывает национальные настройки.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 11:34

Ок. Другая проблема: когда я копирую текстовые строки, состоящие только из цифр Excel воспринимает их как числа. Например расчетный счет организации он показывает как 4.07028E+19. Текстовые строки перед помещением в буфер обмена я беру в кавычки:
Clipboard.SetText """" + s + """"

Как быть?

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

Сообщение alibek » 10.04.2003 (Чт) 11:36

Если первый символ -- апостов ('), то весь остальной текст Excel воспринимает, как текст.
Lasciate ogni speranza, voi ch'entrate.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 10.04.2003 (Чт) 11:39

Кхм.. Позвольте предложит более правильный способ передачи информации.



Делаем так:



set obj = createobject("Excel.Application")

set book = obj.workbooks.add

set sheet = book.worksheets.add



и потом просто через sheet.cells заполняем лист как надо ;)

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 12:11

Попробуй скопируй в буфер обмена следующее: '1234 и вставь в Excel. По крайней мере Excel 2002 english в таком же виде и вставляет Апостроф никуда не девается

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 12:56

To RayShade:
Способ действительно неплохой, но очень медленный
На больших таблицах медленнее раз в 100 и поэтому не хотелось бы его использовать

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 10.04.2003 (Чт) 12:59

Хм... Что то мне кажется, преувеличиваешь ты.. 100 это два порядка- слишком большая разница. Я бы наоборот сказал, что вставка через буфер будт тормозить по идее больше.



Потому что напрямую формированиеи листа задействует меньше ресурсов.

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 13:33

To RayShade:
Открой в Excel огромную таблицу (несколько десятков тысяч записей по 20 колонок) и забери ее в буфер обмена, выбери другой лист и скопируй из буфера. На копирование уйдет пару секунд. Теперь напиши то что предложил ты на VBА. Думаю минуты три повесит. А то и больше.
Я пробовал.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 10.04.2003 (Чт) 13:40

Сравнение некорректно.

Лучше попробуй из вненей программы забивать данные в клипборд, при этом заставляя Excel копировать данные из буфера, либо проделай ту же операцию напрямую через Automation.

retiv
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 15.09.2002 (Вс) 12:20
Откуда: Russia

Сообщение retiv » 10.04.2003 (Чт) 13:49

Проделывал. Быстрее на порядок.
Предлагаю вернуться к основному вопросу. Excel я привел для примера. Нужно в буфер обмена. А там либо в Excel, либо в Матиматику либо МатЛаб.

RayShade
Scarmarked
Scarmarked
Аватара пользователя
 
Сообщения: 5511
Зарегистрирован: 02.12.2002 (Пн) 17:11
Откуда: Russia, Saint-Petersburg

Сообщение RayShade » 10.04.2003 (Чт) 14:04

Ну ладно, убедил ;)

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



Почитай очень пользительную статейку на эту тему MSDN Q247412


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8

    TopList