Добрый вечер! Столкнулся вот с такой задачей: надо отформатировать текстовую строку -> далее ее заносим в двумерный массив -> из массива в базу access.
Так вот как можно сделать из данной строки новую с выбранными данными, чтобы с левой и правой сторон до запятой данные не выбирались. С левой стороны данные могут быть разного размера и 2 и 524 и т.д. Также игнорировать данные между третьей и четвертой запятой.
Т.е. в итоге должна получиться вот такая строка: 0645,001,733,250.0,10.0
Может есть функции, которые позволяют выбирать данные по запятым с учетом того что размерность текста между запятыми может быть разной???
В общем давайте обсуждать
Добрый вечер! Столкнулся вот с такой задачей: надо отформатировать текстовую строку -> далее ее заносим в двумерный массив -> из массива в базу access.
Так вот как можно сделать из данной строки новую с выбранными данными, чтобы с левой и правой сторон до запятой данные не выбирались. С левой стороны данные могут быть разного размера и 2 и 524 и т.д. Также игнорировать данные между третьей и четвертой запятой.
Т.е. в итоге должна получиться вот такая строка: 0645,001,733,250.0,10.0
Может есть функции, которые позволяют выбирать данные по запятым с учетом того что размерность текста между запятыми может быть разной???
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]
попробуйте так: [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
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
kreativ_25, сначала чисто стилистическое замечание. Наверное, только не "формАТИрование", а "формИрование". Как можно "сформатировать" строку, скажем, в Блокноте?
Далее. Если не секрет, как Вы собираетесь разбирать двумерный массив в Access?
И еще один вопрос, чтобы представлять уровень обсуждения: Вы знакомы с ADO или с DAO ?
kreativ_25, сначала чисто стилистическое замечание. Наверное, только не "формАТИрование", а "формИрование". Как можно "сформатировать" строку, скажем, в Блокноте?
Далее. Если не секрет, как Вы собираетесь разбирать двумерный массив в Access?
И еще один вопрос, чтобы представлять уровень обсуждения: Вы знакомы с ADO или с DAO ?Gustav
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
на данный момент я владею навыками программирования на
kreativ_25, я не собираюсь Вас брать к себе на работу (пока во всяком случае), поэтому мне не нужно Ваше полное резюме :)
Мой вопрос про ADO был вызвани тем, что меня насторожило, что Вы не знаете функции Split (не знали до вчерашнего дня), и далее опасения свои я внутренне распространил и на предлагаемый алгоритм с двумерным массивом - подумалось, что Вы по неопытности выстраиваете нечто громоздкое и захотелось помочь именно в упрощении процесса. Может быть, даже без необходимости сплитить и джойнить эту строку через запятую. Вот такие благие помыслы мной руководили.
Просто по жизни я видел много неуклюжих реализаций передач данных между офисными продуктами, написанных программистами систем управления предприятия (SAP, Axapta и др.). И, надо сказать, очень приличными в этих системах программистами, которые, тем не менее, были дремучи как программисты в продуктах MS Office и реализовывали свои алгоритмы почти буквальной перекладкой кода VBA, записанного макрорекодером.
Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше
Вопрос про разбор двумерного массива в Access, мне кажется, не относится к категории "кто и что лучше знает", поэтому на него можно было бы и ответить. Вы, я так понял, запросили обсуждение по всему описанному алгоритму передачи Excel->Access, а не только по строке через запятую, иначе зачем же было рассказывать о двумерном массиве...
на данный момент я владею навыками программирования на
kreativ_25, я не собираюсь Вас брать к себе на работу (пока во всяком случае), поэтому мне не нужно Ваше полное резюме :)
Мой вопрос про ADO был вызвани тем, что меня насторожило, что Вы не знаете функции Split (не знали до вчерашнего дня), и далее опасения свои я внутренне распространил и на предлагаемый алгоритм с двумерным массивом - подумалось, что Вы по неопытности выстраиваете нечто громоздкое и захотелось помочь именно в упрощении процесса. Может быть, даже без необходимости сплитить и джойнить эту строку через запятую. Вот такие благие помыслы мной руководили.
Просто по жизни я видел много неуклюжих реализаций передач данных между офисными продуктами, написанных программистами систем управления предприятия (SAP, Axapta и др.). И, надо сказать, очень приличными в этих системах программистами, которые, тем не менее, были дремучи как программисты в продуктах MS Office и реализовывали свои алгоритмы почти буквальной перекладкой кода VBA, записанного макрорекодером.
Все остальные вопросы я опущу т.к. считаю, что тут не место выяснять кто в текущий момент знает больше
Вопрос про разбор двумерного массива в Access, мне кажется, не относится к категории "кто и что лучше знает", поэтому на него можно было бы и ответить. Вы, я так понял, запросили обсуждение по всему описанному алгоритму передачи Excel->Access, а не только по строке через запятую, иначе зачем же было рассказывать о двумерном массиве...Gustav
Простите, господа, что вторгаюсь в вашу дискуссию, но мне показалось забавным предложить два варианта решения означенной проблемы без использования функции 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
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
Точно, четвёртый не заметил... Можно ещё нарастить Split() и StrReverse(), но тогда уже проще циклом. Ещё вариант - т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов. Думаю код писать уже незачем...
Точно, четвёртый не заметил... Можно ещё нарастить Split() и StrReverse(), но тогда уже проще циклом. Ещё вариант - т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов. Думаю код писать уже незачем...Hugo
т.к. не сказано что количество элементов может меняться - то сплитим, затем конкатенируем нужное. Без циклов и реверсов.
Именно! Здравый инженерный подход по решению конкретной задачи в условиях ограниченного количества перечисляемых через запятую элементов (когда незазорно и ручками без цикла написать): [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]
Код
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