2016-08-31 3 views
0

Я пытаюсь получить дату следующего четверга с текущей даты и записать его на первом слайде. Пока у меня есть текущая дата, но я не нашел, как получить дату следующего четверга. Например, я открываю презентацию во вторник 23.08.2016, и когда мои макросы запускаются, я хочу получить 25.08.2016 (что соответствует четвергу) на первом слайде.PowerPoint macro, чтобы получить дату следующего четверга с текущей даты

До сих пор у меня есть:

Set objPPTX = CreateObject("PowerPoint.Application") 
objPPTX.Visible = True 
'Adding Date on First Slide 
Set PPApp = GetObject(, "Powerpoint.Application") 
    Set PPPres = PPApp.ActivePresentation 
    PPApp.ActiveWindow.ViewType = ppViewSlide 
    PPApp.Visible = True 
    Set PPSlide = PPPres.Slides(PPApp.ActiveWindow.Selection.SlideRange.SlideIndex) 

' Set PPshape = PPSlide.Shapes.AddShape(Type:=msoShapeRectangle, Left:=220, Top:=150, Width:=270, Height:=75) 
Set PPshape1 = PPSlide.Shapes.AddTextbox(msoTextOrientationHorizontal, Left:=20, Top:=150, Width:=680, Height:=70) 
With PPshape1 
.TextFrame.TextRange.Text = "PT PM Weekly" 
.TextFrame.TextRange.Font.Name = "Verdana" 
.TextFrame.TextRange.Font.Color = vbBlack 
.TextFrame.TextRange.Font.Size = 48 
End With 

Set PPshape = PPSlide.Shapes.AddTextbox(msoTextOrientationHorizontal, Left:=350, Top:=150, Width:=680, Height:=70) 
With PPshape 


Todate = DateValue(Now) 
oldWeekDay = Weekday(Now) 
Select Case Thursday 

Case oldWeekDay = 1 
.TextFrame.TextRange.Text = Format(Now + 4, " dd.mm.yyyy") 
Case oldWeekDay = 2 
.TextFrame.TextRange.Text = Format(Now + 3, " dd.mm.yyyy") 
Case oldWeekDay = 3 
.TextFrame.TextRange.Text = Format(Now + 2, " dd.mm.yyyy") 
Case oldWeekDay = 4 
.TextFrame.TextRange.Text = Format(Now + 1, " dd.mm.yyyy") 
Case oldWeekDay = 5 
.TextFrame.TextRange.Text = Format(Now, " dd.mm.yyyy") 
Case oldWeekDay = 6 
.TextFrame.TextRange.Text = Format(Now - 1, " dd.mm.yyyy") 
Case oldWeekDay = 7 
.TextFrame.TextRange.Text = Format(Now - 2, " dd.mm.yyyy") 

End Select 

.TextFrame.TextRange.Font.Name = "Verdana" 
.TextFrame.TextRange.Font.Color = vbBlack 
.TextFrame.TextRange.Font.Size = 48 
End With 

но в конце концов я просто получить +4 от текущей даты, так что я думаю, что проблема заключается в структуре Case.

ответ

1

Нечто подобное поможет, читать WeekDay помощь

Function NEXT_THURSDAY(dtFrom As Date) As Date 

Dim intCurrentDay As Integer 

intCurrentDay = Weekday(dtFrom, vbThursday) 

NEXT_THURSDAY = DateAdd("d", 8 - intCurrentDay, dtFrom) 

End Function 
+0

Благодарю вас за помощь, но я точно не понял, что мне нужно делать? Я не нашел решение для этого – Zigouma

+0

textframe.textrange.text = NEXT_THURSDAY (сейчас) будет таким, каким вы будете использовать, добавьте этот код в код VBA, в новый модуль, если хотите, а затем используйте так. –

+0

это работает thx :) – Zigouma

1

Я думаю, вы не поняли синтаксис Select Case заявления.

Вы начинаете с

Select Case Thursday 

но вы не определили Thursday, поэтому VBA будет считать, эта новая переменная равна 0.

Ваш первый случай является то

Case oldWeekDay = 1 

но Case следует за значением , а не сравнением. VBA оценивает сравнение oldWeekDay = 1 и если оно ложно, преобразование, что значение 0. Таким образом, первый случай всегда будет выполняться, если oldWeekDay не на самом деле равен 1.

То, что я думаю, что вы хотели написать был

Select Case oldWeekDay 
    Case 1 
    .TextFrame.TextRange.Text = Format(Now + 4, " dd.mm.yyyy") 

и так далее.

Обратите внимание, что если вы добавили инструкцию Option Explicit в верхней части своего модуля VBA, вместо этого вы получили бы ошибку Variable not defined для линии Select Case. Настоятельно рекомендуется всегда использовать Option Explicit по такой причине.

+0

'Option Explicit' - очень хорошее предложение! Я согласен, его всегда следует использовать. –

+0

Это работает, спасибо большое :) – Zigouma