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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2012, 14:28   #1
AllenJ
Пользователь
 
Регистрация: 18.01.2011
Сообщений: 45
По умолчанию Макрос разбивки на отдельные ячейки

Здравствуйте, есть у меня макрос, который разбивает содержимое одной ячейки на отдельные ячейки. То есть, если например в одной ячейке стоит цифра 1 и 2, макрос разбивает на 1 в одну ячейку, 2 в другую. Макрос работает с масивом до 5 цифр в одной ячейке включительно. То есть, если в ячейке, скажем 7 цифр - макрос разбивает на 5 ячеек, в пятую же помещает все остальные цифры.
Подскажите, как исправить, чтобы макрос работал на 10 цифр?

Код:
    Application.DisplayAlerts = False
    Selection.TextToColumns Destination:=Selection, DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), Array(2, 1), Array(5, 1), Array(8, 1), Array(11, 1)), _
        TrailingMinusNumbers:=True
        Application.DisplayAlerts = True
AllenJ вне форума Ответить с цитированием
Старый 09.01.2012, 14:48   #2
VictorM
Старожил
 
Аватар для VictorM
 
Регистрация: 15.05.2008
Сообщений: 2,058
По умолчанию

Приведенный Вами фрагмент кода делает не совсем то, что Вы описали.
А разбить до 10-ти знаков может вот такая строка
Код:
Selection.TextToColumns Destination:=Selection, DataType:=xlFixedWidth, _
        FieldInfo:=Array(Array(0, 1), Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), _
        Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1)), _
        TrailingMinusNumbers:=True
P.S.
Может кто напишет короче
"Дайте людям рыбы, и вы накормите их на весь день; научите их ловить рыбу - и вы накормите их на всю жизнь"
"Большое спасибо" - Z261597841314, R208907249777, U447361470499
VictorM вне форума Ответить с цитированием
Старый 09.01.2012, 17:00   #3
AllenJ
Пользователь
 
Регистрация: 18.01.2011
Сообщений: 45
По умолчанию

Спасибо, но что-то не так, разбивает по два столбика через 1, а в десятый вбивает все отсальные цифры
AllenJ вне форума Ответить с цитированием
Старый 09.01.2012, 19:43   #4
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Прикольно Вить, получается. Столкнулся с таким вопросом - как объявить массив массивов в ВБА? Похоже никак:-( в vb.net можно, а в VB - нет. Ну, или я чего-нить не знаю. Получить например, с помощью словаря, легко. Я тут поизгалялся... Делим текст по буквам, длина текста <= 256 символов:
Код:
Private Sub www()
    Dim a(255), tmp(0, 1), i&
    For i = 0 To 255
        tmp(0, 0) = i: tmp(0, 1) = 1: a(i) = tmp
    Next
    Selection.TextToColumns Selection, 2, FieldInfo:=a
End Sub
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 09.01.2012, 19:56   #5
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Эти функции помогут просто и без проблем разобрать любую строковую переменную, без каких либо ограничений.
Код:
Function words(str, Optional Разделитель = "") As Long
'Определяет количество слов в строковой переменной. Аналог команды Rexx.
'На входе:
'str           - Строковая перменная.
'Разделитель   - Символ резделитель. При отсутсвие за разделитель принимаются пробел и таб.
'На выходе:
'words         - Количество слов в переменной.
    If Разделитель = "" Then
        words = UBound(Split(Application.Trim(Replace(str, vbTab, " ")), " ")) + 1
    Else
        words = UBound(Split(Application.Trim(Replace(Replace(str, " ", Chr(160)), Разделитель, " ")), " ")) + 1
    End If
End Function

Function word(str, Number, Optional Разделитель = "") As String
'Функция возвращает n-ное слово в указаной строке. Аналог команды Rexx.
'На входе:
'str           - Строковая перменная.
'Number        - Номер слова.
'Разделитель   - Символ резделитель. При отсутсвие за разделитель принимаются пробел и таб.
'На выходе:
'word          - n-ное слово или пустую строку если слова с таким номером нет.

    If Разделитель = "" Then
        word = Split(Application.Trim(Replace(str, vbTab, " ")), " ")(Number - 1)
    Else
        word = Application.Trim(Replace(Split(Application.Trim(Replace(Replace(str, " ", Chr(160)), Разделитель, " ")), " ")(Number - 1), Chr(160), " "))
    End If
End Function
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 09.01.2012, 20:06   #6
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Попробуйте с их помощью разбить строку по ячейкам. Строка - "1234567890". Или это мы с Виктором неверно поняли вопрос?
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 09.01.2012, 20:18   #7
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Попробуйте с их помощью разбить строку по ячейкам. Строка - "1234567890". Или это мы с Виктором неверно поняли вопрос?
Это не есть текстовая строка. Строка априори состоит из одного и более слов.
Если считать это текстовой строкой, то состоящей из одного слова. Разбор элементарный. А разбор слова на символы, в условии задачи не значился. Для этой задачи я бы использовал mid() и len(). Где то так, на вскидку.
Код:
for n=1 to 5
   if n>len(str) then exit for
   ячейка(n)=mid(str,n,1)
next n
if n<len(str) then ячейка(n)=mid(str,n,len(str)-5)
Хотя возможно это я не понял начальные условия.
С уважением, Алексей.

Последний раз редактировалось tae1980; 09.01.2012 в 20:31.
tae1980 вне форума Ответить с цитированием
Старый 09.01.2012, 20:31   #8
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Цитата:
Сообщение от tae1980 Посмотреть сообщение
Это не есть текстовая строка. Строка априори состоит из одного и более слов.
Что Вы говорите? Для экселя даже пустая строка есть строка. "", " ", "0", "мама мыла..." - все это строки.
Цитата:
Сообщение от tae1980 Посмотреть сообщение
Для этой задачи я бы использовал mid() и len().
Кто не дает? Может у Вас получится короче:-) И быстрей.
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Старый 09.01.2012, 20:36   #9
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Можно использовать не массив массивов, а обычный двумерный массив:
Код:
Sub Макрос1()
Dim x(0 To 9, 0 To 1), i
For i = 0 To 9
    x(i, 0) = i: x(i, 1) = 1
Next
Selection.TextToColumns Destination:=Selection, DataType:=xlFixedWidth, _
    FieldInfo:=x, TrailingMinusNumbers:=True
End Sub
ДОПОЛНЕНИЕ
При большом желании двумерный массив можно сформировать формулой. Для 2007:
Код:
Sub Макрос1()
Selection.TextToColumns Destination:=Selection, DataType:=xlFixedWidth, _
    FieldInfo:=[IFERROR((ROW(1:10)-1)^{1,0},1)], TrailingMinusNumbers:=True
End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619

Последний раз редактировалось Казанский; 09.01.2012 в 20:49.
Казанский вне форума Ответить с цитированием
Старый 09.01.2012, 20:41   #10
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от kuklp Посмотреть сообщение
Что Вы говорите? Для экселя даже пустая строка есть строка. "", " ", "0", "мама мыла..." - все это строки.
Да это все может быть содержание строковой переменной.
"" - пустая строковая переменная.
" " - пустая строковая переменная, содержит один разделитель.
"мама мыла..." - строковая переменная содержит два слова, разделитель пробел. Можно применить более глубокий разбор, определить и убрать многоточие.
Цитата:
Сообщение от kuklp Посмотреть сообщение
Кто не дает? Может у Вас получится короче:-) И быстрей.
Краткость не главный критерий. ИМХО гораздо важнее читаемость, понимаемость, простота модернизации и "красота" листинга (при ~равной производительности кода).
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как разбить числовой ряд на отдельные ячейки jhenya-d Microsoft Office Excel 17 10.11.2011 13:43
макрос для разбивки текста на ячейки Ksiaze Microsoft Office Excel 2 24.05.2011 00:49
Макрос разбивки текста rubbi Microsoft Office Word 1 08.11.2010 23:40
Разбить дату на отдельные ячейки ДД ММ ГГ Александр25 Microsoft Office Excel 5 04.03.2010 19:07
как разбить текстовую ячейку на отдельные ячейки? zetrix Microsoft Office Excel 0 31.10.2006 07:46