Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2011, 00:45   #1
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию Как переменную преобразовать в строку?

Здравствуйте,
столкнулся с проблемой - не могу преобразовать переменную
X = Range("A50:A1048576")
в строку.....

Есть диапазон ячеек А50:А1048576, заполненный числами, для того чтобы записать данные в текстовый файл, надо все данные преобразовать в строковую переменную.

Есть работающий вариант
1.Загнать данные в массив (по средствам цикла) - порядка 8с по времени
2. Из массива создаю строковую переменную
3.Write #FNUM, , MyString - записываю в файл
Долго по времени, пытаюсь ускорить процесс
1. X = Range("A50:A1048576") - присваиваю весь диапазон данных одной переменной (по времени менее 1 с) Выгрыш по времени очевиден!!!!
2. ???????????????????? Тут возникает проблема.
Как преобразовать
X = Range("A50:A1048576") в текстовую переменную?

P.S. - Сохранение в бинарном виде не подходит, нужно чтобы в файле были именно значения (данные столбца А), разделенные к примеру запятой.

Спасибо.

Последний раз редактировалось clever77; 16.05.2011 в 00:50.
clever77 вне форума Ответить с цитированием
Старый 16.05.2011, 01:00   #2
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

а почему бы просто не сохранить как текстовый файл?
а затем лишние строки удалить?
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 16.05.2011, 01:08   #3
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
а почему бы просто не сохранить как текстовый файл?
а затем лишние строки удалить?

типа того
ActiveWorkbook.SaveAs "C:\test.txt", xlText
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 16.05.2011, 01:31   #4
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

наверное не понял вопроса сначала
можно так но есть ограничения в 65536 строк для Transpose
но это будет побыстрее

Код:
c = [a1:a65536].Value
 c = Join(Application.Transpose(c), ",")
 Debug.Print c
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 16.05.2011, 01:47   #5
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Код:
Sub test()
For i = 1 To 16
If i = 1 Then
    c = Range(Cells(50, 1), Cells(65536, 1)).Value
    Else
    c = Range(Cells((i - 1) * 65536 + 1, 1), Cells(i * 65536, 1)).Value
End If
    d = d + Join(Application.Transpose(c), ",")
Next
    Debug.Print d
      'Здесь ваша запись в файл  
End Sub
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234

Последний раз редактировалось R Dmitry; 16.05.2011 в 01:55.
R Dmitry вне форума Ответить с цитированием
Старый 16.05.2011, 01:49   #6
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Честно говоря про такой вариант я даже и не думал.... Сказывается не хватка опыта.

Цитата:
Сообщение от R Dmitry Посмотреть сообщение
типа того
ActiveWorkbook.SaveAs "C:\test.txt", xlText
Да я уже попробывал.... Наверное можно .... Надо будет только подумать как распологать данные на листе..... и как их потом считывать для анализа.... Буду думать в этом направлении

Да уж - век живи, век учись...... СПАСИБО.

Правда вопрос как преобразовать переменную X в текст остается в силе.... Может кто знает.....Если удастся разобраться как работать с такой переменной, то в будущем это очень пригодится...., т.к. это коротко в написании и быстро по времени исполнения. Очень удобно.

Пока знаю как копировать быстро большой объем данных
X = Range("A50:A1048576")
Range("X2").Resize(1048526).Value = X
Копирует все значения диапазона A50:A1048576 в столбец X начиная с ячейки X2 - Быстро и удобно и никаких циклов - красота!!!
clever77 вне форума Ответить с цитированием
Старый 16.05.2011, 01:59   #7
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

аналогично:
Код:
Sub BBB()
  Dim a()
  a = Range("A1:A1048576")
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 16.05.2011, 01:59   #8
R Dmitry
Форумчанин
 
Регистрация: 07.03.2010
Сообщений: 796
По умолчанию

Цитата:
Сообщение от clever77 Посмотреть сообщение
Правда вопрос как преобразовать переменную X в текст остается в силе.... Может кто знает.....
смотрите мой пост последний
Логика?!.... она где то рядом... E_mail: dg_rusak@mail.ru Если спасибо мало: Яндекс . Деньги - 41001731366021 WM R269866874234
R Dmitry вне форума Ответить с цитированием
Старый 16.05.2011, 03:40   #9
clever77
Пользователь
 
Регистрация: 13.04.2011
Сообщений: 58
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
аналогично:
Код:
Sub BBB()
  Dim a()
  a = Range("A1:A1048576")
End Sub
Помоему не совсем так
Если а() массив, то Вы можете написать
Cells(25, 40) = а(3) - т.е присвоите ячейке 4 элемент массива

Если А=Range("A1:A1048576"), то запись
Cells(25, 40) = А(3) - будет недопустима..., т.е после присвоения переменной А диапазона Range, выбрать произвольный элемент из такой переменной невозможно (кроме первого, во всяком случае я такого способа не знаю)

Можно исп Resize
Range("X2").Resize(N).Value = A ,где N число элементов с 1 по N
И если N=3 , то в ячейке X2 будет 1 элемент, в ячейке Х3 будет 2 и в ячеке Х4 будет 3 элемент

Если а() массив, то
MyString = Join(а, [","]) работает (без ограничения на размер 65536) в Excel 2010
Если А=Range, то
MyString = Join(А, [","]) не работает
Нужно уже писать
Join(Application.Transpose(A), ",")


Так что на мой взгляд это не совсем аналогия

Последний раз редактировалось clever77; 16.05.2011 в 04:28. Причина: дополнение
clever77 вне форума Ответить с цитированием
Старый 16.05.2011, 08:25   #10
MCH
Форумчанин
 
Регистрация: 21.11.2010
Сообщений: 326
По умолчанию

Цитата:
Если А=Range("A1:A1048576"), то запись
Cells(25, 40) = А(3) - будет недопустима..., т.е после присвоения переменной А диапазона Range, выбрать произвольный элемент из такой переменной невозможно (кроме первого, во всяком случае я такого способа не знаю)
должно быть так:
Код:
Sub BBB()
  Dim a()
  a = Range("A1:A1048576")
  Cells(25, 40) = a(3, 1)
End Sub
Третий элемент массива
MCH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
столбец преобразовать в строку 0mega Microsoft Office Excel 6 03.02.2010 07:29
Как при нажатии на строку в Listbox передавать нажатую строку в переменную Михаил Юрьевич Общие вопросы Delphi 5 16.03.2009 12:59
Как сохранить строку в регистр или переменную Demonidze Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 10.02.2009 19:52
Как преобразовать строку типа "яяя ччч" в %D1%D1%D1%20%DE%DE%DE kkkggg PHP 2 12.09.2007 13:33
Как преобразовать UINT в строку? Сильванович Михаил Общие вопросы C/C++ 2 12.07.2007 09:58