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

Вход

Регистрация

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

 

= Мир MS Excel/Редактирование данных при помощи макроса - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Редактирование данных при помощи макроса (Макросы/Sub)
Редактирование данных при помощи макроса
radiokiller Дата: Воскресенье, 05.07.2015, 22:04 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
добрый вечер! Помогите пожалуйста с вопросом одним!
Есть макрос, выгружающий данные из другой программы, в Excel они выводятся следующим образом:
[vba]
Код
For Rownum = 1 To EmpDynaset.RecordCount
     
      nCount = nCount + 1
      Rows(nCount).Select
      Selection.Copy
      Selection.Insert Shift:=xlDown
      Application.CutCopyMode = False
      Cells(nCount, 1) = EmpDynaset.Fields(0).Value
      Cells(nCount, 2) = EmpDynaset.Fields(2).Value
      Cells(nCount, 3) = EmpDynaset.Fields(9).Value
      Cells(nCount, 4) = EmpDynaset.Fields(3).Value
      Cells(nCount, 5) = EmpDynaset.Fields(13).Value
      Cells(nCount, 6) = EmpDynaset.Fields(6).Value
      Cells(nCount, 7) = EmpDynaset.Fields(7).Value
      Cells(nCount, 8) = EmpDynaset.Fields(10).Value
      Cells(nCount, 9) = EmpDynaset.Fields(11).Value
      Cells(nCount, 10) = EmpDynaset.Fields(12).Value
        
     
   EmpDynaset.DbMoveNext
[/vba]
Необходимо, чтобы при выполнении этого же макроса данные редактировались так, что если в колонке I они начинаются с 12 или 11, то после этих двух символов ставились 2 пробела, а в колонке J оставались только буквенные символы
Спасибо!
К сообщению приложен файл: 12345.xlsx (13.4 Kb)
 
Ответить
Сообщениедобрый вечер! Помогите пожалуйста с вопросом одним!
Есть макрос, выгружающий данные из другой программы, в Excel они выводятся следующим образом:
[vba]
Код
For Rownum = 1 To EmpDynaset.RecordCount
     
      nCount = nCount + 1
      Rows(nCount).Select
      Selection.Copy
      Selection.Insert Shift:=xlDown
      Application.CutCopyMode = False
      Cells(nCount, 1) = EmpDynaset.Fields(0).Value
      Cells(nCount, 2) = EmpDynaset.Fields(2).Value
      Cells(nCount, 3) = EmpDynaset.Fields(9).Value
      Cells(nCount, 4) = EmpDynaset.Fields(3).Value
      Cells(nCount, 5) = EmpDynaset.Fields(13).Value
      Cells(nCount, 6) = EmpDynaset.Fields(6).Value
      Cells(nCount, 7) = EmpDynaset.Fields(7).Value
      Cells(nCount, 8) = EmpDynaset.Fields(10).Value
      Cells(nCount, 9) = EmpDynaset.Fields(11).Value
      Cells(nCount, 10) = EmpDynaset.Fields(12).Value
        
     
   EmpDynaset.DbMoveNext
[/vba]
Необходимо, чтобы при выполнении этого же макроса данные редактировались так, что если в колонке I они начинаются с 12 или 11, то после этих двух символов ставились 2 пробела, а в колонке J оставались только буквенные символы
Спасибо!

Автор - radiokiller
Дата добавления - 05.07.2015 в 22:04
_Boroda_ Дата: Воскресенье, 05.07.2015, 23:09 | Сообщение № 2
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Что-то в этом роде. Под себя переделаете?
[vba]
Код
Sub tt()
'    nCount = 12
     qq = EmpDynaset.Fields(11).Value
     ww = EmpDynaset.Fields(12).Value
'    qq = 10222
'    ww = "02.11 ВГ"
     z11 = qq
     z12 = ww
     dd = Left(qq, 2)
     If dd = "11" Or dd = "12" Then
         z11 = dd & "  " & Mid(qq, 3, 999)
         dl = Len(z12)
         For i = 1 To dl
             z121 = Mid(z12, i, 1)
             If Not LCase(z121) Like "[0-9.,]" Then 'Вовнутря скобок можно добавить еще ненужные символы
                 z012 = z012 & z121
             End If
         Next i
         z12 = z012
     End If
     Cells(nCount, 9) = z11
     Cells(nCount, 10) = Trim(z12)
End Sub
[/vba]

Если всегда только 2 буквы
[vba]
Код
Sub ttt()
'    nCount = 12
     qq = EmpDynaset.Fields(11).Value
     ww = EmpDynaset.Fields(12).Value
'    qq = 10222
'    ww = "02.11 ВГ"
     z11 = qq
     z12 = ww
     dd = Left(qq, 2)
     If dd = "11" Or dd = "12" Then
         z11 = dd & "  " & Mid(qq, 3, 999)
         z12 = Right(z12, 2)
     End If
     Cells(nCount, 9) = z11
     Cells(nCount, 10) = z12
End Sub
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеЧто-то в этом роде. Под себя переделаете?
[vba]
Код
Sub tt()
'    nCount = 12
     qq = EmpDynaset.Fields(11).Value
     ww = EmpDynaset.Fields(12).Value
'    qq = 10222
'    ww = "02.11 ВГ"
     z11 = qq
     z12 = ww
     dd = Left(qq, 2)
     If dd = "11" Or dd = "12" Then
         z11 = dd & "  " & Mid(qq, 3, 999)
         dl = Len(z12)
         For i = 1 To dl
             z121 = Mid(z12, i, 1)
             If Not LCase(z121) Like "[0-9.,]" Then 'Вовнутря скобок можно добавить еще ненужные символы
                 z012 = z012 & z121
             End If
         Next i
         z12 = z012
     End If
     Cells(nCount, 9) = z11
     Cells(nCount, 10) = Trim(z12)
End Sub
[/vba]

Если всегда только 2 буквы
[vba]
Код
Sub ttt()
'    nCount = 12
     qq = EmpDynaset.Fields(11).Value
     ww = EmpDynaset.Fields(12).Value
'    qq = 10222
'    ww = "02.11 ВГ"
     z11 = qq
     z12 = ww
     dd = Left(qq, 2)
     If dd = "11" Or dd = "12" Then
         z11 = dd & "  " & Mid(qq, 3, 999)
         z12 = Right(z12, 2)
     End If
     Cells(nCount, 9) = z11
     Cells(nCount, 10) = z12
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 05.07.2015 в 23:09
AndreTM Дата: Воскресенье, 05.07.2015, 23:35 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Можно проверять не "ненужные", а "нужные" символы:
[vba]
Код
            ' ...
             If z121 Like "[А-яA-z]" Then 'Вовнутря скобок надо добавить нужные символы
                 z012 = z012 & z121
             End If
             ' ...
[/vba]


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеМожно проверять не "ненужные", а "нужные" символы:
[vba]
Код
            ' ...
             If z121 Like "[А-яA-z]" Then 'Вовнутря скобок надо добавить нужные символы
                 z012 = z012 & z121
             End If
             ' ...
[/vba]

Автор - AndreTM
Дата добавления - 05.07.2015 в 23:35
_Boroda_ Дата: Воскресенье, 05.07.2015, 23:49 | Сообщение № 4
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Можно проверять не "ненужные", а "нужные" символы:

' ...
If z121 Like "[А-яA-z]"

Я думал об этом, но предположил, что если текст такой, например: "03 АА ВВ", то нужно выводить второй пробел - "АА ВВ". Поэтому и написал поиск ненужных. Возможно, я неправ и пробел тоже нужно убирать. А вообще, судя по таблице ниже, там только 3 двухбуквенных значения могут быть.


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
Сообщение
Можно проверять не "ненужные", а "нужные" символы:

' ...
If z121 Like "[А-яA-z]"

Я думал об этом, но предположил, что если текст такой, например: "03 АА ВВ", то нужно выводить второй пробел - "АА ВВ". Поэтому и написал поиск ненужных. Возможно, я неправ и пробел тоже нужно убирать. А вообще, судя по таблице ниже, там только 3 двухбуквенных значения могут быть.

Автор - _Boroda_
Дата добавления - 05.07.2015 в 23:49
radiokiller Дата: Понедельник, 06.07.2015, 00:13 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
_Boroda_, да, спасибо большое! Мне кажется ненужные удобнее убирать. Подскажите пожалуйста, где мне правильно в этом же макросе это прописать? А число строк, которые проверяются как в этом случае ограничивается?
 
Ответить
Сообщение_Boroda_, да, спасибо большое! Мне кажется ненужные удобнее убирать. Подскажите пожалуйста, где мне правильно в этом же макросе это прописать? А число строк, которые проверяются как в этом случае ограничивается?

Автор - radiokiller
Дата добавления - 06.07.2015 в 00:13
_Boroda_ Дата: Понедельник, 06.07.2015, 00:19 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Просто в своем макросе вместо строк
[vba]
Код
    Cells(nCount, 9) = EmpDynaset.Fields(11).Value
      Cells(nCount, 10) = EmpDynaset.Fields(12).Value
[/vba]
вставьте один из моих макросов (без Sub и End Sub). Зеленые строки не нужны - это я писал для того, чтобы Ваши переменные обозначить в своем макросе.
А число строк, которые проверяются как в этом случае ограничивается?

Число строк ограничивается Вашей первой строкой
For Rownum = 1 To EmpDynaset.RecordCount


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеПросто в своем макросе вместо строк
[vba]
Код
    Cells(nCount, 9) = EmpDynaset.Fields(11).Value
      Cells(nCount, 10) = EmpDynaset.Fields(12).Value
[/vba]
вставьте один из моих макросов (без Sub и End Sub). Зеленые строки не нужны - это я писал для того, чтобы Ваши переменные обозначить в своем макросе.
А число строк, которые проверяются как в этом случае ограничивается?

Число строк ограничивается Вашей первой строкой
For Rownum = 1 To EmpDynaset.RecordCount

Автор - _Boroda_
Дата добавления - 06.07.2015 в 00:19
radiokiller Дата: Понедельник, 06.07.2015, 00:45 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
_Boroda_, все понятно, спасибо!
 
Ответить
Сообщение_Boroda_, все понятно, спасибо!

Автор - radiokiller
Дата добавления - 06.07.2015 в 00:45
radiokiller Дата: Понедельник, 06.07.2015, 11:52 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
_Boroda_, добрый день! Подскажите пожалуйста еще, как правильно сделать, чтобы
[vba]
Код
dl = Len(z12)
         For i = 1 To dl
             z121 = Mid(z12, i, 1)
             If Not LCase(z121) Like "[0-9.,]" Then 'Вовнутря скобок можно добавить еще ненужные символы
                 z012 = z012 & z121
             End If
         Next i
         z12 = z012
[/vba]
выполнялось не в условии, а в любом случае для всех записей. Извините, немного неправильно сформулирован вопрос изначально
 
Ответить
Сообщение_Boroda_, добрый день! Подскажите пожалуйста еще, как правильно сделать, чтобы
[vba]
Код
dl = Len(z12)
         For i = 1 To dl
             z121 = Mid(z12, i, 1)
             If Not LCase(z121) Like "[0-9.,]" Then 'Вовнутря скобок можно добавить еще ненужные символы
                 z012 = z012 & z121
             End If
         Next i
         z12 = z012
[/vba]
выполнялось не в условии, а в любом случае для всех записей. Извините, немного неправильно сформулирован вопрос изначально

Автор - radiokiller
Дата добавления - 06.07.2015 в 11:52
AndreTM Дата: Понедельник, 06.07.2015, 12:00 | Сообщение № 9
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
radiokiller, а здесь нет условия :)
Или так - переставьте данный кусочек кода вне обёртывающего IF ... End If. После условия, естественно.
А вообще - нужно заново сформулировать вопрос. Потому что ранее было "... если первые два символа равны тому-то и тому-то, то ... выкинуть все ненужные", а теперь как будет выглядеть условие для выкидывания? "Выкинуть все ненужные всегда"? Но тогда у вас всегда останутся одни буковки и пробелы... Вы уж как-то поточнее рассказывайте, что желаете. Вернее, хотя бы сначала для себя формулируйте желаемое, мы же не телепаты, чтобы видеть,что вам там в голову пришло, когда вы НА СВОЙ экран глядели...


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Понедельник, 06.07.2015, 12:06
 
Ответить
Сообщениеradiokiller, а здесь нет условия :)
Или так - переставьте данный кусочек кода вне обёртывающего IF ... End If. После условия, естественно.
А вообще - нужно заново сформулировать вопрос. Потому что ранее было "... если первые два символа равны тому-то и тому-то, то ... выкинуть все ненужные", а теперь как будет выглядеть условие для выкидывания? "Выкинуть все ненужные всегда"? Но тогда у вас всегда останутся одни буковки и пробелы... Вы уж как-то поточнее рассказывайте, что желаете. Вернее, хотя бы сначала для себя формулируйте желаемое, мы же не телепаты, чтобы видеть,что вам там в голову пришло, когда вы НА СВОЙ экран глядели...

Автор - AndreTM
Дата добавления - 06.07.2015 в 12:00
radiokiller Дата: Понедельник, 06.07.2015, 12:06 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
AndreTM, я правильно понимаю, что эта часть выполняется только если dd = "11" или dd = "12"?
 
Ответить
СообщениеAndreTM, я правильно понимаю, что эта часть выполняется только если dd = "11" или dd = "12"?

Автор - radiokiller
Дата добавления - 06.07.2015 в 12:06
radiokiller Дата: Понедельник, 06.07.2015, 12:15 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 21
Репутация: 0 ±
Замечаний: 20% ±

Excel 2007
AndreTM, да, именно, выкидываться должно всегда, так и хотелось, извините за некорректно поставленную задачу
 
Ответить
СообщениеAndreTM, да, именно, выкидываться должно всегда, так и хотелось, извините за некорректно поставленную задачу

Автор - radiokiller
Дата добавления - 06.07.2015 в 12:15
AndreTM Дата: Понедельник, 06.07.2015, 12:21 | Сообщение № 12
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Ну да, выполняется только при условии
[vba]
Код
InStr(" 11 ; 12 ", " " & Left(Trim(EmpDynaset.Fields(11).Value), 2) & " ") > 0
[/vba]

А насчёт "выкидываться всегда" - задача ещё более некорректна. Что именно должно "выкидываться"? Когда оно "должно выкидываться" - ведь далее, возможно, будут проверки этого значения, и что проверять? занчение до выкидывания или после выкидывания?
Ну и "вишенка"... при больших объемах данных (десятки-сотни тысяч записей в рекордсете) приведенный алгоритм (перебор всех символов в поле) будет безбожно тормозить, надо сразу переходить к использованию RegExp.

Вы лучше приведите пример, строк на сто, где будут исходные данные; и данные, как они должны получиться из этих исходных, вручную прописанные. Причем в различных вариациях, чтобы можно было хотя бы понимать, чего вы добиваетесь при разных видах данных в рекордсете...

Ну и я бы отобрал нужные данные и в нужном виде ещё на этапе запроса, ведь рекордсет вы как-то строите? Надеюсь не просто "SELECT * FROM Table"? :)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Понедельник, 06.07.2015, 12:33
 
Ответить
СообщениеНу да, выполняется только при условии
[vba]
Код
InStr(" 11 ; 12 ", " " & Left(Trim(EmpDynaset.Fields(11).Value), 2) & " ") > 0
[/vba]

А насчёт "выкидываться всегда" - задача ещё более некорректна. Что именно должно "выкидываться"? Когда оно "должно выкидываться" - ведь далее, возможно, будут проверки этого значения, и что проверять? занчение до выкидывания или после выкидывания?
Ну и "вишенка"... при больших объемах данных (десятки-сотни тысяч записей в рекордсете) приведенный алгоритм (перебор всех символов в поле) будет безбожно тормозить, надо сразу переходить к использованию RegExp.

Вы лучше приведите пример, строк на сто, где будут исходные данные; и данные, как они должны получиться из этих исходных, вручную прописанные. Причем в различных вариациях, чтобы можно было хотя бы понимать, чего вы добиваетесь при разных видах данных в рекордсете...

Ну и я бы отобрал нужные данные и в нужном виде ещё на этапе запроса, ведь рекордсет вы как-то строите? Надеюсь не просто "SELECT * FROM Table"? :)

Автор - AndreTM
Дата добавления - 06.07.2015 в 12:21
_Boroda_ Дата: Понедельник, 06.07.2015, 12:29 | Сообщение № 13
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Теоретически (на файле не проверял) должно работать вот так
[vba]
Код
Sub tt()
       z12 = EmpDynaset.Fields(12).Value
           dl = Len(z12)
           For i = 1 To dl
               z121 = Mid(z12, i, 1)
               If Not z121 Like "[0-9.,]" Then
                   z012 = z012 & z121
               End If
           Next i
       Cells(nCount, 9) = WorksheetFunction.Replace(EmpDynaset.Fields(11).Value, 3, 0, "  ")
       Cells(nCount, 10) = Trim(z012)
End Sub
[/vba]


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеТеоретически (на файле не проверял) должно работать вот так
[vba]
Код
Sub tt()
       z12 = EmpDynaset.Fields(12).Value
           dl = Len(z12)
           For i = 1 To dl
               z121 = Mid(z12, i, 1)
               If Not z121 Like "[0-9.,]" Then
                   z012 = z012 & z121
               End If
           Next i
       Cells(nCount, 9) = WorksheetFunction.Replace(EmpDynaset.Fields(11).Value, 3, 0, "  ")
       Cells(nCount, 10) = Trim(z012)
End Sub
[/vba]

Автор - _Boroda_
Дата добавления - 06.07.2015 в 12:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Редактирование данных при помощи макроса (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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