powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание графика VBA Excel
25 сообщений из 39, страница 1 из 2
Создание графика VBA Excel
    #36374130
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наведите на мысль как лучше решить вот такую задачку? Я что-то даже не знаю с чего начать...

на картинке результат который надо получить.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374139
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxi,
Ах да. не дописал.
То что отмеченное серым. надо что бы программа сама закрасила, потом по закрашенной в ячейке цвету она ориентировалась, надо в ячейку заносить число или не надо.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374144
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxiсама закрасила

на основании чего?
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374152
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> на основании чего?

на основании вхождения в диапазон
в строке, первая ячейка - диапазон, в столбце - название дня, вот их пересечение и нужно

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374172
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shocker.Pro
> на основании чего?

на основании вхождения в диапазон
в строке, первая ячейка - диапазон, в столбце - название дня, вот их пересечение и нужно



Как я предполагаю, надо написать функцию распознавания того что написано в ячейке. Если там написано пн-пт. То програма должна найти ячейки пн, вт, ср, чт, пт. Потом по выделенной строке закрасить все эти ячейки.
Но вот только как это написать в коде?
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374205
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Где-то я это уже видел....

Может кто знает как бы сделать так что бы программа различала текст? то есть.
пн, вт, ср, чт, пт. - дни недели
пн-пт - дни когда выходит данная программа.
а значит ячейки пн, вт, ср, чт, пт - должны быть закрашены...

Re: Закраска ячеек в Excel с помощью VBA [new]
.Михаил.
Member

Откуда: Екатеринбург
Сообщений: 15 lopuxi, во такая функция на рассмотрение

Function MyFunc(ByVal mDays As String, ByVal mDay As String) As Boolean
Dim xDay(1 To 7) As String, i As Integer, i1 As Integer, res() As String, mReturn As Boolean
Dim day1 As Integer, day2 As Integer, day3 As Integer
mDays = Replace(mDays, " ", ""): mDay = Replace(mDay, " ", "") ' удаление пробелов
xDay(1) = "пн": xDay(2) = "вт":: xDay(3) = "ср": xDay(4) = "чт"
xDay(5) = "пт": xDay(6) = "сб": xDay(7) = "вс"
mReturn = False
res = Split(mDays, ",")
For i = 0 To UBound(res)
If res(i) Like "??-??" Then
For i1 = 1 To 7
If Mid(res(i), 1, 2) = xDay(i1) Then day2 = i1
If Mid(res(i), 4, 2) = xDay(i1) Then day3 = i1
If mDay = xDay(i1) Then day1 = i1
Next
If day2 <= day1 And day1 <= day3 Then mReturn = True
End If
If res(i) Like "??" And (res(i) = mDay) Then mReturn = True
Next
MyFunc = mReturn
End Function

например

MsgBox MyFunc("ср", "ср")
MsgBox MyFunc("ср, сб", "ср")
MsgBox MyFunc("пн-вс", "ср")
MsgBox MyFunc("пн-ср,пт", "ср")
MsgBox MyFunc("пн,ср-пт,вс", "пт")

возвращает во всех случаях True.

lopuxi, данная функция полностью поставленную Вами задачу не решает, но, я считаю, направит Вас в "правильном направлении"...
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374214
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hugo121Где-то я это уже видел....


да, да я ее тогда так и не решил... сейчас вернулся
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374289
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> Автор: Shocker.Pro
> на основании чего?

на основании вхождения в диапазон
в строке, первая ячейка - диапазон, в столбце - название дня, вот их пересечение и нужно



Ну это неочевидно из приведенного рисунка, поэтому и спросил.

lopuxiна картинке результат который надо получить.

Так как на картинки не все такие пересечения закрашены, все-таки требуется уточнения алгоритма.




Что касается функции распознавания, тут есть два пути:
1) составить массив из 7 дней и соответствующих ему индексов, далее разбирать строку, распознавать элементы массива, запятые и тире. Функция получится универсальная, но громоздкая

2) Решить с помощью справочника, если вариантов ограниченный диапазон.

Вам какой вариант больше нравится?
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374296
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Собственно, первый вариант прописан в ответе Hugo - чем он вас не устраивает?
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374299
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro
lopuxiна картинке результат который надо получить.

Так как на картинки не все такие пересечения закрашены, все-таки требуется уточнения алгоритма.




Что касается функции распознавания, тут есть два пути:
1) составить массив из 7 дней и соответствующих ему индексов, далее разбирать строку, распознавать элементы массива, запятые и тире. Функция получится универсальная, но громоздкая

2) Решить с помощью справочника, если вариантов ограниченный диапазон.

Вам какой вариант больше нравится?


Это просто я закрасил не все ячейки. В обще они все закрашиваются до конца.
В обще мне кажется задачка не моего уровня, я за нее уже третий раз берусь :)
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374320
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProСобственно, первый вариант прописан в ответе Hugo - чем он вас не устраивает?

Вариант может и хороший, я его пытался его применить, но все четно. Я думал может имеется другой способ по проще

Но если нету буду биться с вариантом хуго.
Все же откладывать задачу в четвертый раз не хочется.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374340
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxiВариант может и хороший, я его пытался его применить, но все четно. Я думал может имеется другой способ по проще

Вариант проще - написать ту же функцию с помощью справочника.

Но коли функция УЖЕ НАПИСАНА, стало быть это проще.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374362
Фотография lopuxi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProlopuxiВариант может и хороший, я его пытался его применить, но все четно. Я думал может имеется другой способ по проще

Вариант проще - написать ту же функцию с помощью справочника.

Но коли функция УЖЕ НАПИСАНА, стало быть это проще.

Беда в том что я не смог ее применить
Щас покавыряюсь еще с ней.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374401
Hugo121
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это выше не мой вариант, там если присмотреться .Михаил. автор...
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374404
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxiНо вот только как это написать в коде?

Блин!

Сочинение пользователя sql.ru Игоря Горбоноса на тему:
"Как я провел лето решал- БЫ задачу"
Код: plaintext
1.
2.
                              Здесь водятся драконы.
                              Надпись на старинной карте
           (Эпиграф в какой-то книге по С++ к главе объясняющей смысл ООП)

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

Пишем непосредственно функцию проверки на вхождение в интервал:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Function CheckPoint(ByVal sInterval As String, ByVal nPoint As Long) As Boolean
Dim i As Long, nStartInterval As Long, nEndInterval As Long, vSplitInterval As Variant
vSplitInterval = Split(sInterval, "-")
' Получаем интервалы
nStartInterval = NameDayWeek2Number(vSplitInterval(LBound(vSplitInterval)))
nEndInterval = NameDayWeek2Number(vSplitInterval(UBound(vSplitInterval)))
' Собственно сама проверка
CheckPoint = (nStartInterval >= nPoint And nEndInterval <= nPoint)
End Function
Здесь используется функция возвращающая по аббревиатуре дня недели её номер:
Код: 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.
Private Function NameDayWeek2Number(ByVal sNameDay As String) As Long
' Делаем преобразование дня недели в число, основываясь на том,
' что нет диапазонов переваливающих за воскресенье,
' типа пятница-понедельник
Select Case sNameDay
Case "пн"
    NameDayWeek2Number =  1 
Case "вт"
    NameDayWeek2Number =  2 
Case "ср"
    NameDayWeek2Number =  3 
Case "чт"
    NameDayWeek2Number =  4 
Case "пт"
    NameDayWeek2Number =  5 
Case "сб"
    NameDayWeek2Number =  6 
Case "вс"
    NameDayWeek2Number =  7 
Case Else
'    NameDayWeek2Number = -1
' Если название дня не правильное, генерим ошибку, можно возвращать значение ошибки,
' которое нужно было-бы проверять, но! мне, в сочинении, лень :(
    Err.Raise vbObjectError +  1 , "NameDayWeek2Number", _
    "Не правильная абревиатура для названия дня недели - " & sNameDay
End Select
End Function
Далее нужны два вложенных цикла, для прохода по по двухмерной матрице на листе:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim nRow As Long, nCol As Long
Dim nColInterval As Long, nRowPoint As Long
nColInterval =  1  ' Номер столбца с интервалом
nRowPoint =  2  ' Номер строки с днем недели
For nRow =  3  To По_количеству_строк_с_диапазонами
    For nCol =  2  To  31 
    If CheckPoint(CStr(Cells(nRow, nColInterval).Value), NameDayWeek2Number(CStr(Cells(nRowPoint, nCol).Value))) Then
        ' Тут закрашиваем сереньким
    Else
        ' Тут убираем любую закраску
    End If
    Next nCol
Next nRow
В результате получаем нужный результат.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374414
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь, ну ты балуешь человека.

Так он совсем самостоятельно думать перестанет
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374446
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> Игорь, ну ты балуешь человека.

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

> Так он совсем самостоятельно думать перестанет

Я давно согласился с выводом, что сложная реализация сложна в понимании, тем более если человек учится.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374569
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносЯ давно согласился с выводом, что сложная реализация сложна в понимании, тем более если человек учится.

тогда почему
Код: plaintext
1.
?CheckPoint("ср-чт", 4 )
False

и где проверка на диапазон в виде перечисления?
кстати, я так понимаю, диапазон может быть и таким: "пн-вт, чт-пт"
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374619
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proтогда почему
Код: plaintext
1.
?CheckPoint("ср-чт", 4 )
False


Потому, что не правильно написанно условие проверки, там написанно начало интервала больше или равно И конец интервала
меньше или равен
нужно так:
Код: plaintext
1.
' Собственно сама проверка
CheckPoint = (nStartInterval <= nPoint And nEndInterval >= nPoint)
Начало интервала меньше или равен И конец интервала больше или равен

> и где проверка на диапазон в виде перечисления?

В смысле?

> кстати, я так понимаю, диапазон может быть и таким: "пн-вт, чт-пт"

может, и будет, может и таким быть - "пн"

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374627
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, раз Игорь молчит - доработал сам

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Public Function CheckPoint(ByVal sInterval As String, ByVal nPoint As Long) As Boolean

Dim i As Integer, nStartInterval As Long, nEndInterval As Long, SplitInner() As String, SplitOuter() As String
CheckPoint = False
sInterval = Replace(sInterval, " ", "")
SplitOuter = Split(sInterval, ",")

For i =  0  To UBound(SplitOuter)
  SplitInner = Split(SplitOuter(i), "-")
  nStartInterval = NameDayWeek2Number(SplitInner(LBound(SplitInner)))
  nEndInterval = NameDayWeek2Number(SplitInner(UBound(SplitInner)))
  CheckPoint = (nStartInterval <= nPoint And nEndInterval >= nPoint)
  If CheckPoint Then Exit For
Next
  
End Function

кажись так
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374631
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь Горбонос
> и где проверка на диапазон в виде перечисления?

В смысле?


третья строка задания

Игорь Горбонос
> кстати, я так понимаю, диапазон может быть и таким: "пн-вт, чт-пт"

может, и будет, может и таким быть - "пн"


Ну с этим как раз твой алгоритм справлялся :)
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374634
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> тогда почему

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

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374657
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Автор: Shocker.Pro
> третья строка задания

Упс! теперь я, не внимательно изучил задание


> кажись так

Но одобряю

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36374706
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносПотому, что я писал сочинение и не проверял на работоспособность

Вот всегда удивлялся, почему на форуме работоспособность решения проверяет не аффтар, а третьи лица. Но сегодня - сам попался.

Игорь Горбоносполучить простой и понятный код, который можно развивать дальше.

Вот это тебе удалось. Доказано мной.
...
Рейтинг: 0 / 0
Создание графика VBA Excel
    #36375183
.Михаил.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lopuxiShocker.ProСобственно, первый вариант прописан в ответе Hugo - чем он вас не устраивает?

Вариант может и хороший, я его пытался его применить, но все четно. Я думал может имеется другой способ по проще

Но если нету буду биться с вариантом хуго.
Все же откладывать задачу в четвертый раз не хочется.
функция не рабочая? укажите при каких входящих параметрах она [функция] "работает" неправильно?
это заголовок моей функции
Код: plaintext
1.
Function MyFunc(ByVal mDays As String, ByVal mDay As String) As Boolean
, где
mDay - это день недели, для которого нужно определить, входит ли в интервал или нет (на Вашем рисунке это "значения" по горизонтали);
mDays - это интервал(ы) дней недели (на Вашем рисунке это "значения" по вертикали).
Эти входящие параметры путать местами нельзя. И обязательно они должны быть типа String .
Выше уже приводили конечную реализацию, приведу свою (с использованием своей функции) (на основании рисунка в 1-ом сообщении)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub MyCheck()
Const Vert =  0  ' смещение на листе по вертикали
Const Gor =  0  ' смещение на листе по горизонтали
Dim i As Long, j As Long, Count As Long, Interv As String, mDay As String
Count =  10  ' количество интервало, допустим 10
For i =  1  + (Vert +  2 ) To Count + (Vert +  2 ) 
     Interv = CStr(Cells(i, Gor +  1 ).Value)
     For j =  1  + (Gor +  1 ) To  31  + (Gor +  1 ) 
          mDay = CStr(Cells(Vert +  1 , j).Value)
          Cells(i, j).Interior.ColorIndex = IIf(MyFunc(Interv, mDay),  3 , xlNone)
     Next
Next
End Sub
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Создание графика VBA Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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