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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2013, 14:07   #1
Questru
Почемучка-новичок
Пользователь
 
Регистрация: 08.10.2010
Сообщений: 67
По умолчанию Почему код выполняется правильно только один раз?

Добрый день!

Написал макрос.

Цитата:
Sub Test()

Cells(3, 20) = Cells(7, 8)
Cells(3, 20).Select
Selection.TextToColumns , DataType:=xlDelimited, Comma:=True

cell_var_all = Cells(3, Columns.Count).End(xlToLeft).Column
step = 4
For cell_var = 20 To cell_var_all

If InStr(1, Cells(3, cell_var), "/", vbTextCompare) > 0 Then
Cells(step, 20) = Cells(3, cell_var)
Cells(step, 20).Select
Selection.TextToColumns , DataType:=xlDelimited, Other:=True, OtherChar:="/"
step = step + 1
Cells(3, cell_var).ClearContents
End If
Next cell_var

End Sub
При первом запуске работает всё ок.
Когда запускаю второй раз, создается впечатление, что он выполняет вот такой код:
Цитата:
Cells(3, 20) = Cells(7, 8)
Cells(3, 20).Select
Selection.TextToColumns , DataType:=xlDelimited, Comma:=True, Other:=True, OtherChar:="/"
В чем косяк?

П.С.
Если закрыть и открыть файл, то все возвращается на круги своя, но только до второго раза.
Комп ребутал...

Последний раз редактировалось Questru; 24.01.2013 в 14:10.
Questru вне форума Ответить с цитированием
Старый 24.01.2013, 14:14   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Выкладывайте пример файла. Не зная, что находится в ячейках, сложно вам ответить. Проблема скорее не в самом макросе, а в данных.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 24.01.2013, 14:24   #3
Questru
Почемучка-новичок
Пользователь
 
Регистрация: 08.10.2010
Сообщений: 67
По умолчанию

Файл в прищепке.

П.С.
Да и почему он при подсчете возвращает только 1, а не 2...
Вложения
Тип файла: zip Test.zip (11.5 Кб, 10 просмотров)
Questru вне форума Ответить с цитированием
Старый 24.01.2013, 14:42   #4
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

У вас после первого запуска макроса разделяет не только по запятым, но и по слешам.

посмотрите вложение, я там немного переделал ваш макрос.
Вложения
Тип файла: zip Копия Test.zip (9.5 Кб, 8 просмотров)
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 24.01.2013, 14:45   #5
Questru
Почемучка-новичок
Пользователь
 
Регистрация: 08.10.2010
Сообщений: 67
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
У вас после первого запуска макроса разделяет не только по запятым, но и по слешам.

посмотрите вложение, я там немного переделал ваш макрос.
Большое спасибо!

Фига себе немного =) теперь буду разбираться, что там и чего значит =)
Questru вне форума Ответить с цитированием
Старый 24.01.2013, 15:39   #6
Questru
Почемучка-новичок
Пользователь
 
Регистрация: 08.10.2010
Сообщений: 67
По умолчанию

Более внимательно посмотрел макрос, он выполняет малость не то что нужно...
1. После первого разбиения, на новые строки он должен переносить значения ячеек только тех, которые содержат символ "/"

2. Ну и хотелось бы понять почему именно мой способ глючит...
Если я вообще всю удаляю и оставляю только
Цитата:
Cells(3, 2) = Cells(1, 1)
Cells(3, 2).Select
Selection.TextToColumns , DataType:=xlDelimited, Comma:=True
то он, редиска, все равно разбивает даже по символу "/"
Questru вне форума Ответить с цитированием
Старый 24.01.2013, 15:48   #7
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
Sub Test()
  Dim A$(), B$()
  S = [A1]
  A = Split(S, ",")
  I = 1
  [A2].Offset(I) = I
  For Each El In A
    J = 1
    If InStr(1, El, "/", vbTextCompare) > 0 Then
      B = Split(El, "/")
      For Each El2 In B
        [A2].Offset(I, J) = El2
        J = J + 1
      Next El2
      [A2].Offset(I) = I
    Else
      [A2].Offset(1, I) = El
    End If
    I = I + 1
  Next El
End Sub
можно немного поменять.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 25.01.2013, 09:41   #8
Questru
Почемучка-новичок
Пользователь
 
Регистрация: 08.10.2010
Сообщений: 67
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
Код:
Sub Test()
  Dim A$(), B$()
  S = [A1]
  A = Split(S, ",")
  I = 1
  [A2].Offset(I) = I
  For Each El In A
    J = 1
    If InStr(1, El, "/", vbTextCompare) > 0 Then
      B = Split(El, "/")
      For Each El2 In B
        [A2].Offset(I, J) = El2
        J = J + 1
      Next El2
      [A2].Offset(I) = I
    Else
      [A2].Offset(1, I) = El
    End If
    I = I + 1
  Next El
End Sub
можно немного поменять.
Спасибо!
А как в S = [A1] единицу поменять на переменную или, вообще, А1 заменить на более удобноваримую для меня форму cells(row,column)

Последний раз редактировалось Questru; 25.01.2013 в 09:58.
Questru вне форума Ответить с цитированием
Старый 25.01.2013, 09:50   #9
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

например, так:
Код:
S = Range("$A$"&Var)
где Var - переменная
а можно так:
Код:
S = [A1].offset(RowShift, ColumnShift)
где RowShift - смещение по строкам ( =Var-1 из предыдущего примера)
ColumnShift - смещение по столбцам
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработать событие только один раз Suliman1 C# (си шарп) 2 03.09.2012 15:45
Скрипт правильно работает только один раз, после начинает выдавать ошибку Xodock JavaScript, Ajax 2 23.07.2012 17:35
Скрипт выполняется только один раз MAKSA JavaScript, Ajax 6 12.02.2010 13:48
Непонятная ошибка (код срабатывает только один раз) Marsel737 Общие вопросы Delphi 4 10.02.2010 16:37
timer срабатывает только один раз! KWN, lnc Общие вопросы Delphi 1 05.03.2009 12:58