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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2010, 14:23   #1
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию Запись одномерного массива в столбец

Всем доброго дня!
Не могу понять, в чем проблема?
Пытаюсь записать одномерный массив в столбец "А"
Пробовал так с txt:
Код:
NewFilename = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "" & VendorEngName & ".txt")
Set fso = CreateObject("scripting.filesystemobject")
Set ts = fso.CreateTextFile(NewFilename, True)
ts.Write Join(Application.Transpose(Application.Index(txt_array, 0, 1)), vbCrLf)
ts.Close
Set ts = Nothing: Set fso = Nothing
В итоге получается файл только с одной первой строкой массива
Пробовал так с csv:
Код:
NewFilename = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "" & VendorEngName & ".csv")
Workbooks.Open Filename:=NewFilename
Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = txt_array
'и даже так
Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = Join(Application.Transpose(Application.Index(txt_array, 0, 1)), vbCrLf)
В итоге все ячейки содержат первую строку массива.
Помогите советом!
p.s.: первым кодом пользуюсь не первый раз в другом своем проекте. Все работает! Только там массив двумерный.

Последний раз редактировалось Maxx; 13.08.2010 в 14:31.
Maxx вне форума Ответить с цитированием
Старый 13.08.2010, 15:35   #2
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

1) Поаккуратнее с Application.Transpose() - она выдаст ошибку если длина текстовой строки в одном из элементов превысит 255 символов

2) У меня вложенный файл работает без проблем. Возможно настало время и вам выложить файл-пример

3) Проверьте: может массив txt_array изначально ориентирован не так, как вы думаете, применяя Application.Index()
Вложения
Тип файла: zip Book1.zip (8.7 Кб, 10 просмотров)
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN

Последний раз редактировалось KL (XL); 13.08.2010 в 15:38.
KL (XL) вне форума Ответить с цитированием
Старый 13.08.2010, 16:05   #3
Maxx
Форумчанин
 
Аватар для Maxx
 
Регистрация: 29.10.2008
Сообщений: 294
По умолчанию

Код Вашего файла похоже ничем не отличается от моего.
К сожалению на рабочем компе запрещен upload файлов, так что могу выложить код:
Код:
Sub CreateCSV_TXT()

    'Формирование строки "TXT"
    Dim csv As Long, global_array(), txt_array()
    Dim str As String

    global_array() = Range([A2], Cells(Cells(Rows.Count, 1).End(xlUp).Row, 1).Offset(0, 13))
    ReDim Preserve global_array(1 To UBound(global_array, 1), 1 To UBound(global_array, 2))
    ReDim txt_array(1 To UBound(global_array, 1))

    For csv = 1 To UBound(global_array(), 1)
        m_name = global_array(csv, 1)
        m_sku_orig = global_array(csv, 2)
        m_sku_alt = global_array(csv, 3)
        m_desc = global_array(csv, 4)
        m_in_stock = global_array(csv, 5)
        m_availability = global_array(csv, 6)
        m_vendor_price = global_array(csv, 7)
        m_price = global_array(csv, 8)
        m_sku = global_array(csv, 9)
        m_category_id = global_array(csv, 10)
        m_vendor_name = global_array(csv, 11)
        m_vehicle_brand = global_array(csv, 12)
        m_margin = global_array(csv, 13)
        m_revision = 0

        str = "" & m_name & ";" & m_sku_orig & ";" & m_sku_alt & ";" & m_desc _
        & ";" & m_in_stock & ";" & m_availability & ";" & m_vendor_price _
        & ";" & m_price & ";" & m_sku & ";" & m_category_id & ";" & m_vendor_name _
        & ";" & m_vehicle_brand & ";" & m_margin & ";" & m_revision & ""
        txt_array(csv) = str
    Next csv

    ReDim Preserve txt_array(1 To UBound(txt_array, 1))

'1-ый вариант
    NewFilename = Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "price.txt")
    Set fso = CreateObject("scripting.filesystemobject")
    Set ts = fso.CreateTextFile(NewFilename, True)
        ts.Write Join(Application.Transpose(Application.Index(txt_array, 0, 1)), vbCrLf)
        ts.Close
    Set ts = Nothing: Set fso = Nothing
'2-ой вариант   
    Workbooks.Open Filename:=Replace(ThisWorkbook.FullName, ThisWorkbook.Name, "price.csv")
    Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = txt_array
    'или
    'Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = Join(Application.Transpose(Application.Index(txt_array, 0, 1)), vbCrLf)
    
End Sub
Сделал так (последняя страка во 2-м варианте с csv):
Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = Application.Transpose(txt_array)
Работает.

Последний раз редактировалось Maxx; 13.08.2010 в 16:26.
Maxx вне форума Ответить с цитированием
Старый 13.08.2010, 16:40   #4
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Ну второй вариант даже пробовать не надо - вы там забыли Application.Transpose(), а так должен работать стопроцентно. А вот первый посмотрю как доберусь до Excel.
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 13.08.2010, 16:46   #5
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

В первом варианте, пока проверить не могу, но сдается мне вы там намудрили с Transpose() и Index(). Попробуйте заменить

Код:
ts.Write Join(Application.Transpose(Application.Index(txt_array, 0, 1)), vbCrLf)
на

Код:
x = Join(txt_array, vbCrLf)
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 13.08.2010, 17:02   #6
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
По умолчанию

Кстати, вот тут:

Код:
Range([A1], Cells(UBound(txt_array, 1), 1).Address).Value = txt_array
использование свойства .Address - избыточно. Достаточно:

Код:
Range([A1], Cells(UBound(txt_array, 1), 1)).Value = txt_array
Да и вообще опасная конструкция, надежнее так:

Код:
    With ActiveSheet
        .Range(.Cells(1, 1), .Cells(UBound(txt_array, 1), 1)).Value = txt_array
    End With
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Старый 13.08.2010, 19:12   #7
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от KL (XL) Посмотреть сообщение
Код:
Range([A1], Cells(UBound(txt_array, 1), 1)).Value = txt_array
Да и вообще опасная конструкция, надежнее так:

Код:
    With ActiveSheet
        .Range(.Cells(1, 1), .Cells(UBound(txt_array, 1), 1)).Value = txt_array
    End With
Кирилл, а в чём "опасность" этой конструкции (если, конечно, этот код не размещён в модуле какого-то другого листа)?

Лично я разницы не вижу...
EducatedFool вне форума Ответить с цитированием
Старый 13.08.2010, 20:34   #8
KL (XL)
Форумчанин
 
Аватар для KL (XL)
 
Регистрация: 04.08.2009
Сообщений: 112
Печаль

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Кирилл, а в чём "опасность" этой конструкции (если, конечно, этот код не размещён в модуле какого-то другого листа)?

Лично я разницы не вижу...
Это - в том числе, но главное (и я не говорю, что код неправильный) с точки зрения оптимальности структуры кода, и учитывая частоту проблемы несогласования диапазонов в форумах, в первом случае объект листа задается в трех местах в коде, что способствует возможным ошибкам.
KL [MVP - Microsoft Office Excel]
CPU: Intel Core 2, 2.17GHz | RAM: 3.25GB (4GB) | GPU: nVidia Quadro FX 2500M
OS: Windows 7 Ultimate x64 EN | MSO: 2010 Professional Plus x86 EN
KL (XL) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# - из одномерного массива -> двумерный Vovan_Super Общие вопросы .NET 2 06.07.2010 19:27
Упорядочение одномерного массива. Arzamaks Помощь студентам 4 25.11.2009 09:46
Задача одномерного массива на Си++ Клеом Помощь студентам 1 26.09.2009 21:49
Задачка одномерного массива Клеом Помощь студентам 2 26.09.2009 19:20
Сортировка одномерного массива laponka Помощь студентам 7 14.09.2009 09:00