Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при сдвиге месяца, выполнить нужный код. / 25 сообщений из 44, страница 1 из 2
03.07.2010, 09:24
    #36721190
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Excel 2007 VBA
Здравствуйте.
При определение месяца в условии, выполняется код, начиная с точки отчета a1 (выполняется 12 кодов на каждый месяц), но если выбран февраль, то начиная с точки отчета, выполняются 11 месяцев (позиция 2) происходит сдвиг и а12 выполняется в пустую. Как сделать или создать условие, чтобы выполнялись те позиции которые выпадают на месяца.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
'Позиция 1
If a=1Then 'в условие январь месяц
    a1= 1  'январь
    a2= 2  'февраль
    a3= 3  'март
    a4= 4  'апрель
    a5= 5  'май
    a6= 6  'июнь
    a7= 7  'июль
    a8= 8  'август
    a9= 9  'сентябрь
    a10= 10  'октябрь
    a11= 11  'ноябрь
    a12= 12  'декабрь 
End If
'Позиция 2
If a=2Then 'в условие февраль месяц
    a1= 2  'февраль
    a2= 3  'март
    a3= 4  'апрель
    a4= 5  'май
    a5= 6  'июнь
    a6= 7  'июль
    a7= 8  'август
    a8= 9  'сентябрь
    a9= 10  'октябрь
    a10= 11  'ноябрь
    a11= 12  'декабрь
    a12= 13  'код не выполняется
End If
'Позиция 3
If a=3Then 'в условие март месяц
    a1= 3  'март
    a2= 4  'апрель
    a3= 5  'май
    a4= 6  'июнь
    a5= 7  'июль
    a6= 8  'август
    a7= 9  'сентябрь
    a8= 10  'октябрь
    a9= 11  'ноябрь
    a10= 12  'декабрь
    a11= 13  'код не выполняется
    a12= 14  'код не выполняется
End If
'...
'Позиция 12
If a= 12  Then 'в условие декабрь месяц
    a1= 12  'декабрь
    a2= 13  'код не выполняется
    a3= 14  'код не выполняется
    a4= 15  'код не выполняется
    a5= 16  'код не выполняется
    a6= 17  'код не выполняется
    a7= 18  'код не выполняется
    a8= 19  'код не выполняется
    a9= 20  'код не выполняется
    a10= 21  'код не выполняется
    a11= 22  'код не выполняется
    a12= 23  'код не выполняется
End If
...
Рейтинг: 0 / 0
03.07.2010, 11:37
    #36721254
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segail,

Как я понимаю, это образец, а что реально представляет из себя нужный код? Возможно проще доработать этот код так, чтобы он работал с параметром.

В общем, обрисуйте задачу чуть подробнее, возможно удастся сделать проще, чем вы предполагаете...
...
Рейтинг: 0 / 0
03.07.2010, 11:51
    #36721263
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro, подождём ответа автора, хотел спросить почти в тему, имеем:
а="сс"
If ..... Then GoTo a
......
......
......
сс:


'насколько я знаю, такой конструкцией нельзя пользоваться, не скажете почему?
...
Рейтинг: 0 / 0
03.07.2010, 11:58
    #36721269
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Ципихович Эндрю 'насколько я знаю, такой конструкцией нельзя пользоваться, не скажете почему?
А почему вместо "Ципихович" нельзя написать "Цепехович"?
...
Рейтинг: 0 / 0
03.07.2010, 12:07
    #36721274
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segail,

В принципе, если есть 12 абсолютно разных процедур, никак не похожих друг на друга можно поступить примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Sub Switcher (Cnt As Integer)

Select Case Cnt
  Case  1 : Cat
  Case  2 : Dog
  Case  3 : Table
  Case  4 : Chair
  Case  5 : Water
  Case  6 : Book
  Case  7 : Tea
  Case  8 : Printer
  Case  9 : Cassete
  Case  10 : Lamp
  Case  11 : Glass
  Case  12 : Door
End Select

End Sub
Далее, в зависимости от потребностей, устраиваете цикл вызова:
Код: plaintext
1.
2.
For i= 1  to  6 
  Switcher i
Next
соответственно, выполняется часть процедур в определенной последовательности
...
Рейтинг: 0 / 0
03.07.2010, 12:10
    #36721278
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Если очень хочется то можно, опять же с условием:

f=.....
w=....
If f=w Then "Цепехович"="Ципихович"
А если серьёзно, то я понял, что ответа который мне будет понятен я не получу.
Спросим по другому, Ваше мнение конструкция вида:
а="сс"
If ..... Then GoTo a
......
......
......
сс:
Имеет право на существование?
Может иметь практическое для программиста?
Я считаю что да
...
Рейтинг: 0 / 0
03.07.2010, 12:14
    #36721282
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
А в этом столбике:
Cat
Dog
Table
Chair
Water
Book
Tea
Printer
Cassete
Lamp
Glass
Door
Это для примера?
...
Рейтинг: 0 / 0
03.07.2010, 12:15
    #36721283
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Думал на форуме нет не кого, временно отключался..
Вот код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
Public Sub Test()
    Dim i As Integer
    For i =  1  To  450 
        With Sheets("Отчет")
            If Form_SelectDate.ComboBox_Month = CStr(.Cells(i,  27 ).Text) Or UserForm4.ComboBox1 = CStr(.Cells(i,  27 ).Text) Then 'a*    Form_SelectDate.ComboBox_Month = месяц  или  UserForm4.ComboBox1 = месяц
                ' Удаление данных на выбранный месяц, и ниже следующих м-ц
                .Cells(i +  35 ,  21 ).Value =  0 : .Cells(i,  26 ).Resize( 31 ) = "": .Cells(i,  31 ).Resize( 31 ) = "" 'a*
                .Cells(i +  72 ,  21 ).Value =  0 : .Cells(i +  37 ,  26 ).Resize( 31 ) = "": .Cells(i +  37 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  109 ,  21 ).Value =  0 : .Cells(i +  74 ,  26 ).Resize( 31 ) = "": .Cells(i +  74 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  146 ,  21 ).Value =  0 : .Cells(i +  111 ,  26 ).Resize( 31 ) = "": .Cells(i +  111 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  183 ,  21 ).Value =  0 : .Cells(i +  148 ,  26 ).Resize( 31 ) = "": .Cells(i +  148 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  220 ,  21 ).Value =  0 : .Cells(i +  185 ,  26 ).Resize( 31 ) = "": .Cells(i +  185 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  257 ,  21 ).Value =  0 : .Cells(i +  222 ,  26 ).Resize( 31 ) = "": .Cells(i +  222 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  294 ,  21 ).Value =  0 : .Cells(i +  259 ,  26 ).Resize( 31 ) = "": .Cells(i +  259 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  331 ,  21 ).Value =  0 : .Cells(i +  296 ,  26 ).Resize( 31 ) = "": .Cells(i +  296 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  368 ,  21 ).Value =  0 : .Cells(i +  333 ,  26 ).Resize( 31 ) = "": .Cells(i +  333 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  405 ,  21 ).Value =  0 : .Cells(i +  370 ,  26 ).Resize( 31 ) = "": .Cells(i +  370 ,  31 ).Resize( 31 ) = ""
                .Cells(i +  442 ,  21 ).Value =  0 : .Cells(i +  407 ,  26 ).Resize( 31 ) = "": .Cells(i +  407 ,  31 ).Resize( 31 ) = ""
            End If
        End With
    Next
End Sub
...
Рейтинг: 0 / 0
03.07.2010, 12:28
    #36721296
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailВот код
м-да, кривовато как-то...
ну да чтоб голову вам не морочить - воспользуйтесь моим примером с Case
...
Рейтинг: 0 / 0
03.07.2010, 12:35
    #36721302
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro,
Боле подробно чтобы Вы поняли.
12 строк кода на двенадцать месяцев.
Если, например, по условию выпадает февраль, то первая строка выполняет код февраля, естественно остальные строки выпадают на месяца после февраля, значит 12-я строка выполняет пустое действие, в данном случае необходимо блокировать или запретить выполнение кода 12-ой строки, ну и так далее…
...
Рейтинг: 0 / 0
03.07.2010, 12:38
    #36721304
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailShocker.Pro,
Боле подробно чтобы Вы поняли.
12 строк кода на двенадцать месяцев.
Если, например, по условию выпадает февраль, то первая строка выполняет код февраля, естественно остальные строки выпадают на месяца после февраля, значит 12-я строка выполняет пустое действие, в данном случае необходимо блокировать или запретить выполнение кода 12-ой строки, ну и так далее…
ну так я же привел код.
Запускаете цикл от 2 до 12
...
Рейтинг: 0 / 0
03.07.2010, 12:41
    #36721306
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro,
Лады попробую. Спасибо
...
Рейтинг: 0 / 0
03.07.2010, 15:17
    #36721388
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Ципихович ЭндрюСпросим по другому, Ваше мнение конструкция вида:
а="сс"
If ..... Then GoTo a
......
......
......
сс:
Имеет право на существование?
Может иметь практическое для программиста?
Я считаю что да

Может иметь.

В принципе, это можно в VB6... точнее, не совсем это, а вызов процедуры по указателю в виде переменной... но кажется этот способ недокументирован, кажется его когда-то давно приводил Antonariy...
...
Рейтинг: 0 / 0
03.07.2010, 15:22
    #36721390
Ципихович Эндрю
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
может Antonariy напомнит?
...
Рейтинг: 0 / 0
03.07.2010, 15:24
    #36721393
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.ProsegailВот код
м-да, кривовато как-то...

Как я понимаю, у вас на листе есть что-то типа календаря, поэтому расстояние в ячейках между двумя месяцами неравномерно и зависит от количества дней.

Если делать по уму - у вас должна быть универсальная функция, вычисляющая (или тупо знающая) по номеру месяца, где он расположен, то есть функция, которая возвращает координаты месяца на листе по его номеру.

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

Ну это по уму....
...
Рейтинг: 0 / 0
03.07.2010, 16:12
    #36721421
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro,
Умышленно сделано равномерно, чтобы не замарачиваться мне.

У меня еще с условием проблема. Одна форма из двух всегда будет закрыта. Я поставил Or (или)
но код глючит, из-за отсутствие одного из ComboBox. Это как то лечится?
If Form_SelectDate.ComboBox_Month = CStr(.Cells(i, 27).Text) Or UserForm4.ComboBox1 = CStr(.Cells(i, 27).Text) Then
...
Рейтинг: 0 / 0
03.07.2010, 16:15
    #36721423
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.ProЦипихович ЭндрюСпросим по другому, Ваше мнение конструкция вида:
а="сс"
If ..... Then GoTo a
......
......
......
сс:
Имеет право на существование?
Может иметь практическое для программиста?
Я считаю что да

Может иметь.

В принципе, это можно в VB6... точнее, не совсем это, а вызов процедуры по указателю в виде переменной... но кажется этот способ недокументирован, кажется его когда-то давно приводил Antonariy...Не то чтобы не документирован, просто гемороен и нафиг не нужен в прикладных программах.
Вызов процедуры "по указателю" можно реализовать с помощью классов CreateObject (progid - переменная) или с помощью CallByName (переменная — название метода).
...
Рейтинг: 0 / 0
03.07.2010, 16:16
    #36721426
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailУмышленно сделано равномерно, чтобы не замарачиваться мне.
не знаю.
в цифрах 35, 72, 109, 146, 183, 220 я равномерности не нашел, иначе предложил бы другой алгоритм.

segailУ меня еще с условием проблема. Одна форма из двух всегда будет закрыта. Я поставил Or (или)
но код глючит, из-за отсутствие одного из ComboBox. Это как то лечится?
If Form_SelectDate.ComboBox_Month = CStr(.Cells(i, 27).Text) Or UserForm4.ComboBox1 = CStr(.Cells(i, 27).Text) Then
Этот код запустит обе формы, вне зависимости о того, что было закрыто. А вопрос я не очень понял.
...
Рейтинг: 0 / 0
03.07.2010, 16:19
    #36721429
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro,
ну как нет количество промежуточных ячеек 37. Или Вы о другом?
...
Рейтинг: 0 / 0
03.07.2010, 16:24
    #36721432
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.ProЭтот код запустит обе формы, вне зависимости о того, что было закрыто. А вопрос я не очень понял.
Этот код не запускает форму.
С одной из двух форм будет выполнен код вызванный (например кликом по кнопке) из модуля. Одна из форм всегда будет закрыта.
...
Рейтинг: 0 / 0
03.07.2010, 16:24
    #36721433
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailShocker.Pro,
ну как нет количество промежуточных ячеек 37. Или Вы о другом?
О, чёрт, видимо не туда посмотрел. "Признаю себя ослом и жду дальнейших распоряжений" (с)

Тогда мне непонятна вообще вот эта конструкция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
.Cells(i +  35 ,  21 ).Value =  0 : .Cells(i,  26 ).Resize( 31 ) = "": .Cells(i,  31 ).Resize( 31 ) = "" 'a*
.Cells(i +  72 ,  21 ).Value =  0 : .Cells(i +  37 ,  26 ).Resize( 31 ) = "": .Cells(i +  37 ,  31 ).Resize( 31 ) = ""
.Cells(i +  109 ,  21 ).Value =  0 : .Cells(i +  74 ,  26 ).Resize( 31 ) = "": .Cells(i +  74 ,  31 ).Resize( 31 ) = ""
.Cells(i +  146 ,  21 ).Value =  0 : .Cells(i +  111 ,  26 ).Resize( 31 ) = "": .Cells(i +  111 ,  31 ).Resize( 31 ) = ""
.Cells(i +  183 ,  21 ).Value =  0 : .Cells(i +  148 ,  26 ).Resize( 31 ) = "": .Cells(i +  148 ,  31 ).Resize( 31 ) = ""
.Cells(i +  220 ,  21 ).Value =  0 : .Cells(i +  185 ,  26 ).Resize( 31 ) = "": .Cells(i +  185 ,  31 ).Resize( 31 ) = ""
.Cells(i +  257 ,  21 ).Value =  0 : .Cells(i +  222 ,  26 ).Resize( 31 ) = "": .Cells(i +  222 ,  31 ).Resize( 31 ) = ""
.Cells(i +  294 ,  21 ).Value =  0 : .Cells(i +  259 ,  26 ).Resize( 31 ) = "": .Cells(i +  259 ,  31 ).Resize( 31 ) = ""
.Cells(i +  331 ,  21 ).Value =  0 : .Cells(i +  296 ,  26 ).Resize( 31 ) = "": .Cells(i +  296 ,  31 ).Resize( 31 ) = ""
.Cells(i +  368 ,  21 ).Value =  0 : .Cells(i +  333 ,  26 ).Resize( 31 ) = "": .Cells(i +  333 ,  31 ).Resize( 31 ) = ""
.Cells(i +  405 ,  21 ).Value =  0 : .Cells(i +  370 ,  26 ).Resize( 31 ) = "": .Cells(i +  370 ,  31 ).Resize( 31 ) = ""
.Cells(i +  442 ,  21 ).Value =  0 : .Cells(i +  407 ,  26 ).Resize( 31 ) = "": .Cells(i +  407 ,  31 ).Resize( 31 ) = ""
почему она не в цикле сама по себе?
Тогда все, что я советовал, нафиг не нужно. Просто сделать из этого цикл и все. Запускать цикл можно будет с любого по любой месяц по желанию.
...
Рейтинг: 0 / 0
03.07.2010, 16:27
    #36721435
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailЭтот код не запускает форму.
Этот код запускает форму, если она не запущена.
Если не верите, поставьте MsgBox в UserForm_Initialize и убедитесь в этом.
...
Рейтинг: 0 / 0
03.07.2010, 16:33
    #36721439
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
Shocker.Pro,
Любой месяц выбирается на форме Form_SelectDate в ComboBox_Month затем клик по кнопке например так.
Код: plaintext
1.
2.
Private Sub CommandButton1_Click()
    Module2.Test
End Sub
и происходит, назовем очищение нужных ячеек. Как должно происходить очищение я говорил выше (на основание условия)
...
Рейтинг: 0 / 0
03.07.2010, 16:34
    #36721441
segail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
пример
...
Рейтинг: 0 / 0
03.07.2010, 16:36
    #36721442
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
при сдвиге месяца, выполнить нужный код.
segailShocker.Pro,
Любой месяц выбирается на форме Form_SelectDate в ComboBox_Month затем клик по кнопке например так.
Код: plaintext
1.
2.
Private Sub CommandButton1_Click()
    Module2.Test
End Sub
и происходит, назовем очищение нужных ячеек. Как должно происходить очищение я говорил выше (на основание условия)
Ну и в чем проблема?
Если выбран апрель, то надо просто устроить цикл от 4 до 12.
В цикле будет одна строчка:
Код: plaintext
.Cells(i +  109 ,  21 ).Value =  0 : .Cells(i +  74 ,  26 ).Resize( 31 ) = "": .Cells(i +  74 ,  31 ).Resize( 31 ) = ""
только вместо конкретных цифр будет выражение на основе переменной цикла.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / при сдвиге месяца, выполнить нужный код. / 25 сообщений из 44, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]