Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Форматирование текстовой строки для двумерного массива - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
Страница 1 из 11
Модератор форума: _Boroda_, Pelena, Manyasha, SLAVICK 
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Форматирование текстовой строки для двумерного массива (Макросы/Sub)
Форматирование текстовой строки для двумерного массива
kreativ_25 Дата: Пятница, 08.01.2016, 00:11 | Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Добрый вечер!
Столкнулся вот с такой задачей: надо отформатировать текстовую строку -> далее ее заносим в двумерный массив -> из массива в базу access.

Текстовая строка: 2,0645,001,1,733,250.0,10.0,050116

Так вот как можно сделать из данной строки новую с выбранными данными, чтобы с левой и правой сторон до запятой данные не выбирались. С левой стороны данные могут быть разного размера и 2 и 524 и т.д. Также игнорировать данные между третьей и четвертой запятой.

Т.е. в итоге должна получиться вот такая строка: 0645,001,733,250.0,10.0

Может есть функции, которые позволяют выбирать данные по запятым с учетом того что размерность текста между запятыми может быть разной???

В общем давайте обсуждать :)


Сообщение отредактировал kreativ_25 - Пятница, 08.01.2016, 00:14
 
Ответить
СообщениеДобрый вечер!
Столкнулся вот с такой задачей: надо отформатировать текстовую строку -> далее ее заносим в двумерный массив -> из массива в базу access.

Текстовая строка: 2,0645,001,1,733,250.0,10.0,050116

Так вот как можно сделать из данной строки новую с выбранными данными, чтобы с левой и правой сторон до запятой данные не выбирались. С левой стороны данные могут быть разного размера и 2 и 524 и т.д. Также игнорировать данные между третьей и четвертой запятой.

Т.е. в итоге должна получиться вот такая строка: 0645,001,733,250.0,10.0

Может есть функции, которые позволяют выбирать данные по запятым с учетом того что размерность текста между запятыми может быть разной???

В общем давайте обсуждать :)

Автор - kreativ_25
Дата добавления - 08.01.2016 в 00:11
Kuzmich Дата: Пятница, 08.01.2016, 00:32 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 308
Репутация: 57 ±
Замечаний: 0% ±

Excel 2003
Цитата
Может есть функции

Смотрите Split
 
Ответить
Сообщение
Цитата
Может есть функции

Смотрите Split

Автор - Kuzmich
Дата добавления - 08.01.2016 в 00:32
Michael_S Дата: Пятница, 08.01.2016, 00:34 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1831
Репутация: 343 ±
Замечаний: 0% ±

Excel2016
далее ее заносим в двумерный массив
а где двумерный массив?


ЯД: 41001136675053
WM: R389613894253
 
Ответить
Сообщение
далее ее заносим в двумерный массив
а где двумерный массив?

Автор - Michael_S
Дата добавления - 08.01.2016 в 00:34
Michael_S Дата: Пятница, 08.01.2016, 00:48 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1831
Репутация: 343 ±
Замечаний: 0% ±

Excel2016
попробуйте так:
[vba]
Код
Function Форматирование_Текстовой_Строки_Для_Двумерного_Массива$(Исходная_Ячейка$)
    Dim A, AA(), i&, j&
    A = Split(Исходная_Ячейка, ",")
    ReDim AA(UBound(A) - 3)
    For i = 1 To UBound(A) - 1
        If i <> 3 Then AA(j) = A(i): j = j + 1
    Next
    Форматирование_Текстовой_Строки_Для_Двумерного_Массива = Join(AA, ",")
End Function
[/vba]
К сообщению приложен файл: kreativ_25.xlsm(16Kb)


ЯД: 41001136675053
WM: R389613894253
 
Ответить
Сообщениепопробуйте так:
[vba]
Код
Function Форматирование_Текстовой_Строки_Для_Двумерного_Массива$(Исходная_Ячейка$)
    Dim A, AA(), i&, j&
    A = Split(Исходная_Ячейка, ",")
    ReDim AA(UBound(A) - 3)
    For i = 1 To UBound(A) - 1
        If i <> 3 Then AA(j) = A(i): j = j + 1
    Next
    Форматирование_Текстовой_Строки_Для_Двумерного_Массива = Join(AA, ",")
End Function
[/vba]

Автор - Michael_S
Дата добавления - 08.01.2016 в 00:48
Kuzmich Дата: Пятница, 08.01.2016, 00:52 | Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 308
Репутация: 57 ±
Замечаний: 0% ±

Excel 2003
UDF
[vba]
Код

Function TexStr(cell As String) As String
Dim i As Integer
Dim iTemp
   iTemp = Split(cell, ",")
   If UBound(iTemp) > 3 Then
     For i = 1 To UBound(iTemp) - 1
       If i <> 3 Then
         TexStr = TexStr & iTemp(i) & ","
       End If
     Next
       TexStr = Left(TexStr, Len(TexStr) - 1)
   End If
End Function
[/vba]
 
Ответить
СообщениеUDF
[vba]
Код

Function TexStr(cell As String) As String
Dim i As Integer
Dim iTemp
   iTemp = Split(cell, ",")
   If UBound(iTemp) > 3 Then
     For i = 1 To UBound(iTemp) - 1
       If i <> 3 Then
         TexStr = TexStr & iTemp(i) & ","
       End If
     Next
       TexStr = Left(TexStr, Len(TexStr) - 1)
   End If
End Function
[/vba]

Автор - Kuzmich
Дата добавления - 08.01.2016 в 00:52
Gustav Дата: Пятница, 08.01.2016, 02:20 | Сообщение № 6
Группа: Друзья
Ранг: Старожил
Сообщений: 1441
Репутация: 550 ±
Замечаний: 0% ±

начинал с Excel 4.0...
kreativ_25, сначала чисто стилистическое замечание. Наверное, только не "формАТИрование", а "формИрование". Как можно "сформатировать" строку, скажем, в Блокноте?

Далее. Если не секрет, как Вы собираетесь разбирать двумерный массив в Access?

И еще один вопрос, чтобы представлять уровень обсуждения: Вы знакомы с ADO или с DAO ?


Мой tip box - яд 41001663842605
 
Ответить
Сообщениеkreativ_25, сначала чисто стилистическое замечание. Наверное, только не "формАТИрование", а "формИрование". Как можно "сформатировать" строку, скажем, в Блокноте?

Далее. Если не секрет, как Вы собираетесь разбирать двумерный массив в Access?

И еще один вопрос, чтобы представлять уровень обсуждения: Вы знакомы с ADO или с DAO ?

Автор - Gustav
Дата добавления - 08.01.2016 в 02:20
kreativ_25 Дата: Пятница, 08.01.2016, 23:37 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 7
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Michael_S и Kuzmich спасибо огромное за помощь и идеи!

Gustav, на данный момент я владею навыками программирования на c#, vba, sql (50/50 в процессе изучения), toc, mql4, mql5. С ADO я знаком, применяю в работе, но знаю только поверхностно... пока поверхностно. В марте этого года буду поступать на третье высшее образование - программист.

Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше :)
 
Ответить
СообщениеMichael_S и Kuzmich спасибо огромное за помощь и идеи!

Gustav, на данный момент я владею навыками программирования на c#, vba, sql (50/50 в процессе изучения), toc, mql4, mql5. С ADO я знаком, применяю в работе, но знаю только поверхностно... пока поверхностно. В марте этого года буду поступать на третье высшее образование - программист.

Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше :)

Автор - kreativ_25
Дата добавления - 08.01.2016 в 23:37
Gustav Дата: Суббота, 09.01.2016, 02:02 | Сообщение № 8
Группа: Друзья
Ранг: Старожил
Сообщений: 1441
Репутация: 550 ±
Замечаний: 0% ±

начинал с Excel 4.0...
на данный момент я владею навыками программирования на


kreativ_25, я не собираюсь Вас брать к себе на работу (пока во всяком случае), поэтому мне не нужно Ваше полное резюме :)

Мой вопрос про ADO был вызвани тем, что меня насторожило, что Вы не знаете функции Split (не знали до вчерашнего дня), и далее опасения свои я внутренне распространил и на предлагаемый алгоритм с двумерным массивом - подумалось, что Вы по неопытности выстраиваете нечто громоздкое и захотелось помочь именно в упрощении процесса. Может быть, даже без необходимости сплитить и джойнить эту строку через запятую. Вот такие благие помыслы мной руководили.

Просто по жизни я видел много неуклюжих реализаций передач данных между офисными продуктами, написанных программистами систем управления предприятия (SAP, Axapta и др.). И, надо сказать, очень приличными в этих системах программистами, которые, тем не менее, были дремучи как программисты в продуктах MS Office и реализовывали свои алгоритмы почти буквальной перекладкой кода VBA, записанного макрорекодером.

Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше

Вопрос про разбор двумерного массива в Access, мне кажется, не относится к категории "кто и что лучше знает", поэтому на него можно было бы и ответить. Вы, я так понял, запросили обсуждение по всему описанному алгоритму передачи Excel->Access, а не только по строке через запятую, иначе зачем же было рассказывать о двумерном массиве...


Мой tip box - яд 41001663842605
 
Ответить
Сообщение
на данный момент я владею навыками программирования на


kreativ_25, я не собираюсь Вас брать к себе на работу (пока во всяком случае), поэтому мне не нужно Ваше полное резюме :)

Мой вопрос про ADO был вызвани тем, что меня насторожило, что Вы не знаете функции Split (не знали до вчерашнего дня), и далее опасения свои я внутренне распространил и на предлагаемый алгоритм с двумерным массивом - подумалось, что Вы по неопытности выстраиваете нечто громоздкое и захотелось помочь именно в упрощении процесса. Может быть, даже без необходимости сплитить и джойнить эту строку через запятую. Вот такие благие помыслы мной руководили.

Просто по жизни я видел много неуклюжих реализаций передач данных между офисными продуктами, написанных программистами систем управления предприятия (SAP, Axapta и др.). И, надо сказать, очень приличными в этих системах программистами, которые, тем не менее, были дремучи как программисты в продуктах MS Office и реализовывали свои алгоритмы почти буквальной перекладкой кода VBA, записанного макрорекодером.

Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше

Вопрос про разбор двумерного массива в Access, мне кажется, не относится к категории "кто и что лучше знает", поэтому на него можно было бы и ответить. Вы, я так понял, запросили обсуждение по всему описанному алгоритму передачи Excel->Access, а не только по строке через запятую, иначе зачем же было рассказывать о двумерном массиве...

Автор - Gustav
Дата добавления - 09.01.2016 в 02:02
МВТ Дата: Суббота, 09.01.2016, 09:52 | Сообщение № 9
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 136 ±
Замечаний: 0% ±

Excel 2007
Простите, господа, что вторгаюсь в вашу дискуссию, но мне показалось забавным предложить два варианта решения означенной проблемы без использования функции Split, хотя полностью признаю, что с практической точки зрения предложенные выше варианты являются более эффективными
[vba]
Код
Function tt(Text As String) As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "^.+?,(.+),.+$"
        If .test(Text) Then tt = .Execute(Text)(0).SubMatches(0)
    End With
End Function

Function tt_1(Text As String) As String
    Dim L As Long
    L = InStr(Text, ",")
    If L = 0 Then Exit Function
    tt_1 = Right(Text, Len(Text) - L)
    L = InStrRev(tt_1, ",")
    If L = 0 Then Exit Function
    tt_1 = Left(tt_1, L - 1)
End Function
[/vba]
 
Ответить
СообщениеПростите, господа, что вторгаюсь в вашу дискуссию, но мне показалось забавным предложить два варианта решения означенной проблемы без использования функции Split, хотя полностью признаю, что с практической точки зрения предложенные выше варианты являются более эффективными
[vba]
Код
Function tt(Text As String) As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "^.+?,(.+),.+$"
        If .test(Text) Then tt = .Execute(Text)(0).SubMatches(0)
    End With
End Function

Function tt_1(Text As String) As String
    Dim L As Long
    L = InStr(Text, ",")
    If L = 0 Then Exit Function
    tt_1 = Right(Text, Len(Text) - L)
    L = InStrRev(tt_1, ",")
    If L = 0 Then Exit Function
    tt_1 = Left(tt_1, L - 1)
End Function
[/vba]

Автор - МВТ
Дата добавления - 09.01.2016 в 09:52
RAN Дата: Суббота, 09.01.2016, 10:32 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4549
Репутация: 920 ±
Замечаний: 0% ±

2010
предложенные выше варианты являются более эффективными

Почему?

И, до кучи B)
[vba]
Код
Function мяу$(rr As Range)
    мяу = Mid$(rr, InStr(rr, ",") + 1, InStrRev(rr, ",") - InStr(rr, ",") - 1)
End Function
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение
предложенные выше варианты являются более эффективными

Почему?

И, до кучи B)
[vba]
Код
Function мяу$(rr As Range)
    мяу = Mid$(rr, InStr(rr, ",") + 1, InStrRev(rr, ",") - InStr(rr, ",") - 1)
End Function
[/vba]

Автор - RAN
Дата добавления - 09.01.2016 в 10:32
Gustav Дата: Суббота, 09.01.2016, 10:53 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1441
Репутация: 550 ±
Замечаний: 0% ±

начинал с Excel 4.0...
Коллеги, там вообще-то ещё надо 4-й член исходной строки вырезать... ;)


Мой tip box - яд 41001663842605
 
Ответить
СообщениеКоллеги, там вообще-то ещё надо 4-й член исходной строки вырезать... ;)

Автор - Gustav
Дата добавления - 09.01.2016 в 10:53
RAN Дата: Суббота, 09.01.2016, 11:00 | Сообщение № 12
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4549
Репутация: 920 ±
Замечаний: 0% ±

2010
А надо-ли?
"А" упало, "Б" упало, "В" само с трубы пропало. :D


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеА надо-ли?
"А" упало, "Б" упало, "В" само с трубы пропало. :D

Автор - RAN
Дата добавления - 09.01.2016 в 11:00
Kuzmich Дата: Суббота, 09.01.2016, 11:09 | Сообщение № 13
Группа: Проверенные
Ранг: Обитатель
Сообщений: 308
Репутация: 57 ±
Замечаний: 0% ±

Excel 2003
RAN
ТС просил
Цитата
Также игнорировать данные между третьей и четвертой запятой.

Где это в вашем коде реализуется?
 
Ответить
СообщениеRAN
ТС просил
Цитата
Также игнорировать данные между третьей и четвертой запятой.

Где это в вашем коде реализуется?

Автор - Kuzmich
Дата добавления - 09.01.2016 в 11:09
RAN Дата: Суббота, 09.01.2016, 11:13 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 4549
Репутация: 920 ±
Замечаний: 0% ±

2010
Пардоньте, пропустил :(


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПардоньте, пропустил :(

Автор - RAN
Дата добавления - 09.01.2016 в 11:13
МВТ Дата: Суббота, 09.01.2016, 12:13 | Сообщение № 15
Группа: Проверенные
Ранг: Обитатель
Сообщений: 476
Репутация: 136 ±
Замечаний: 0% ±

Excel 2007
Да, тоже не доглядел :(. Тогда так[vba]
Код
Function tt(Text As String) As String
     With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "^.+?,((.*?,){2}).+?,((.+?)+),.+$"
        If .test(Text) Then tt = .Replace(Text, "$1" & "$3")
     End With
End Function
[/vba]
 
Ответить
СообщениеДа, тоже не доглядел :(. Тогда так[vba]
Код
Function tt(Text As String) As String
     With CreateObject("VBScript.RegExp")
        .Global = True
        .Pattern = "^.+?,((.*?,){2}).+?,((.+?)+),.+$"
        If .test(Text) Then tt = .Replace(Text, "$1" & "$3")
     End With
End Function
[/vba]

Автор - МВТ
Дата добавления - 09.01.2016 в 12:13
Hugo Дата: Суббота, 09.01.2016, 22:39 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2681
Репутация: 600 ±
Замечаний: 0% ±

Для разнообразия без циклов, только Split() (и StrReverse()):
[vba]
Код
Sub tt()
    Dim s$
    s = "2,0645,001,1,733,250.0,10.0,050116"
    s = StrReverse(Split(StrReverse(Split(s, ",", 2)(1)), ",", 2)(1))
    MsgBox s
End Sub
[/vba]


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069


Сообщение отредактировал Hugo - Суббота, 09.01.2016, 22:39
 
Ответить
СообщениеДля разнообразия без циклов, только Split() (и StrReverse()):
[vba]
Код
Sub tt()
    Dim s$
    s = "2,0645,001,1,733,250.0,10.0,050116"
    s = StrReverse(Split(StrReverse(Split(s, ",", 2)(1)), ",", 2)(1))
    MsgBox s
End Sub
[/vba]

Автор - Hugo
Дата добавления - 09.01.2016 в 22:39
Gustav Дата: Суббота, 09.01.2016, 23:58 | Сообщение № 17
Группа: Друзья
Ранг: Старожил
Сообщений: 1441
Репутация: 550 ±
Замечаний: 0% ±

начинал с Excel 4.0...
Hugo, :)
там вообще-то ещё надо 4-й член исходной строки вырезать

ТС просил
Цитата
Также игнорировать данные между третьей и четвертой запятой.


Но большое спасибо за напоминание о существовании 3-го параметра функции Split !


Мой tip box - яд 41001663842605
 
Ответить
СообщениеHugo, :)
там вообще-то ещё надо 4-й член исходной строки вырезать

ТС просил
Цитата
Также игнорировать данные между третьей и четвертой запятой.


Но большое спасибо за напоминание о существовании 3-го параметра функции Split !

Автор - Gustav
Дата добавления - 09.01.2016 в 23:58
Hugo Дата: Воскресенье, 10.01.2016, 00:28 | Сообщение № 18
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2681
Репутация: 600 ±
Замечаний: 0% ±

Точно, четвёртый не заметил...
Можно ещё нарастить Split() и StrReverse(), но тогда уже проще циклом.
Ещё вариант - т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов.
Думаю код писать уже незачем...


excel@nxt.ru
webmoney: E265281470651 R418926282008 Z422237915069
 
Ответить
СообщениеТочно, четвёртый не заметил...
Можно ещё нарастить Split() и StrReverse(), но тогда уже проще циклом.
Ещё вариант - т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов.
Думаю код писать уже незачем...

Автор - Hugo
Дата добавления - 10.01.2016 в 00:28
Gustav Дата: Воскресенье, 10.01.2016, 00:47 | Сообщение № 19
Группа: Друзья
Ранг: Старожил
Сообщений: 1441
Репутация: 550 ±
Замечаний: 0% ±

начинал с Excel 4.0...
т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов.

Именно! Здравый инженерный подход по решению конкретной задачи в условиях ограниченного количества перечисляемых через запятую элементов (когда незазорно и ручками без цикла написать):
[vba]
Код
Sub uu()
    Dim s$, a
    s = "2,0645,001,1,733,250.0,10.0,050116"
    a = Split(s, ",")
    s = Join(Array(a(1), a(2), a(4), a(5), a(6)), ",")
    Debug.Print s '0645,001,733,250.0,10.0
End Sub
[/vba]


Мой tip box - яд 41001663842605

Сообщение отредактировал Gustav - Воскресенье, 10.01.2016, 00:47
 
Ответить
Сообщение
т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов.

Именно! Здравый инженерный подход по решению конкретной задачи в условиях ограниченного количества перечисляемых через запятую элементов (когда незазорно и ручками без цикла написать):
[vba]
Код
Sub uu()
    Dim s$, a
    s = "2,0645,001,1,733,250.0,10.0,050116"
    a = Split(s, ",")
    s = Join(Array(a(1), a(2), a(4), a(5), a(6)), ",")
    Debug.Print s '0645,001,733,250.0,10.0
End Sub
[/vba]

Автор - Gustav
Дата добавления - 10.01.2016 в 00:47
krosav4ig Дата: Воскресенье, 10.01.2016, 06:29 | Сообщение № 20
Группа: Друзья
Ранг: Старожил
Сообщений: 1466
Репутация: 597 ±
Замечаний: 0% ±

Excel 2007, 2013
До кучи
[vba]
Код
Function gg$(s$)
    gg = Join(Application.Index(Split(s, ","), Array(2, 3, 5, 6, 7)))
End Function
[/vba]


(_)Õvõ(_)
 
Ответить
СообщениеДо кучи
[vba]
Код
Function gg$(s$)
    gg = Join(Application.Index(Split(s, ","), Array(2, 3, 5, 6, 7)))
End Function
[/vba]

Автор - krosav4ig
Дата добавления - 10.01.2016 в 06:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Форматирование текстовой строки для двумерного массива (Макросы/Sub)
Страница 1 из 11
Поиск:

Яндекс цитирования
© 2010-2017 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!