Здравствуйте. Была такая тема на другой ветке: http://www.excelworld.ru/forum/2-18583-1 Вопрос остался открытым, а здесь будет актуальнее, раз это решается с помощью макроса. Было предложено решение:[vba]
Код
Private Sub Workbook_Open() Call insCln End Sub
Public Sub insCln() Const fDone = "!" Const lName = "buff" If Sheets(lName).Cells(1, 1).Value <> fDone Then If Date >= #8/1/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(3).Insert: Cells(1, 3) = Date ThisWorkbook.Save End If End If End Sub
[/vba]
Вариант подходит, только надо вставлять не один столбец, а после каждой следующей даты. Я попробовал методом научного тыка(не специалист по макросам) доработать. Получилось следующее: [vba]
Код
Option Explicit
Private Sub Workbook_Open() Call insCln End Sub
Public Sub insCln() Const fDone = "!" Const lName = "buff" If Sheets(lName).Cells(1, 1).Value <> fDone Then If Date >= #8/1/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(3).Insert: Cells(1, 3) = Date If Date >= #8/11/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(4).Insert: Cells(1, 4) = "Новый столбец" ThisWorkbook.Save End If End If End If End Sub
[/vba]
Но так не работает. Может подскажет кто, где ошибка? Надо, что бы столбец вставлялся после второго, следующий после третьего, следующий после четвёртого и т.д. Главное, чтобы только один раз по-прошествии каждой даты, прописанной в макросе. Спасибо.
Здравствуйте. Была такая тема на другой ветке: http://www.excelworld.ru/forum/2-18583-1 Вопрос остался открытым, а здесь будет актуальнее, раз это решается с помощью макроса. Было предложено решение:[vba]
Код
Private Sub Workbook_Open() Call insCln End Sub
Public Sub insCln() Const fDone = "!" Const lName = "buff" If Sheets(lName).Cells(1, 1).Value <> fDone Then If Date >= #8/1/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(3).Insert: Cells(1, 3) = Date ThisWorkbook.Save End If End If End Sub
[/vba]
Вариант подходит, только надо вставлять не один столбец, а после каждой следующей даты. Я попробовал методом научного тыка(не специалист по макросам) доработать. Получилось следующее: [vba]
Код
Option Explicit
Private Sub Workbook_Open() Call insCln End Sub
Public Sub insCln() Const fDone = "!" Const lName = "buff" If Sheets(lName).Cells(1, 1).Value <> fDone Then If Date >= #8/1/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(3).Insert: Cells(1, 3) = Date If Date >= #8/11/2015# Then Sheets(lName).Cells(1, 1).Value = fDone Sheets("Лист1").Columns(4).Insert: Cells(1, 4) = "Новый столбец" ThisWorkbook.Save End If End If End If End Sub
[/vba]
Но так не работает. Может подскажет кто, где ошибка? Надо, что бы столбец вставлялся после второго, следующий после третьего, следующий после четвёртого и т.д. Главное, чтобы только один раз по-прошествии каждой даты, прописанной в макросе. Спасибо.Новичёк
Private Sub Workbook_Open() Dim i&, n&, aDates(): aDates = Array(#8/1/2015#, #8/11/2015#, #8/21/2015#) ' здесь прописываете все свои даты With Лист1 For i = 0 To UBound(aDates) If aDates(i) > Date Then Exit For If WorksheetFunction.CountIf(.UsedRange.Rows(1), aDates(i)) = 0 Then n = .UsedRange.Columns.Count .Columns(n).Insert .Cells(1, n) = aDates(i) End If Next End With End Sub
[/vba] Без скрытых листов, доп. ячеек и прочих "хитростей".
Добрый день! Можно так: [vba]
Код
Private Sub Workbook_Open() Dim i&, n&, aDates(): aDates = Array(#8/1/2015#, #8/11/2015#, #8/21/2015#) ' здесь прописываете все свои даты With Лист1 For i = 0 To UBound(aDates) If aDates(i) > Date Then Exit For If WorksheetFunction.CountIf(.UsedRange.Rows(1), aDates(i)) = 0 Then n = .UsedRange.Columns.Count .Columns(n).Insert .Cells(1, n) = aDates(i) End If Next End With End Sub
[/vba] Без скрытых листов, доп. ячеек и прочих "хитростей".KSV
KSV, мои извинения. Действительно ещё не дожили до того радостного момента. А по примеру огромное спасибо, работает как и хотелось. И маленький вопрос вдогонку: Что надо вставить вместо aDates(i), что бы формат даты был либо месяц:год, либо просто год?
KSV, мои извинения. Действительно ещё не дожили до того радостного момента. А по примеру огромное спасибо, работает как и хотелось. И маленький вопрос вдогонку: Что надо вставить вместо aDates(i), что бы формат даты был либо месяц:год, либо просто год?Новичёк
Не совсем понял, что вы имеете ввиду... Если в первой ячейке нового, вставляемого, столбца должно быть только значение года (из наступившей даты), то вместо: [vba]
Код
.Cells(1, n) = aDates(i)
[/vba] напишите: [vba]
Код
.Cells(1, n) = Year(aDates(i))
[/vba], если какого-то другого года, то так: [vba]
Код
.Cells(1, n) = 2016
[/vba] А если нужно просто отображать эту дату в формате ММ.ГГГГ, то перед или после вышеупомянутой строки добавьте еще одну: [vba]
Код
.Cells(1, n).NumberFormat = "mm/yyyy"
[/vba] или "mmm yyyy" - чтобы отображать "авг 2015", или "mmmm yyyy" - чтобы отображать "Август 2015", или "yyyy" - чтобы отображать только год, и т.д.
Не совсем понял, что вы имеете ввиду... Если в первой ячейке нового, вставляемого, столбца должно быть только значение года (из наступившей даты), то вместо: [vba]
Код
.Cells(1, n) = aDates(i)
[/vba] напишите: [vba]
Код
.Cells(1, n) = Year(aDates(i))
[/vba], если какого-то другого года, то так: [vba]
Код
.Cells(1, n) = 2016
[/vba] А если нужно просто отображать эту дату в формате ММ.ГГГГ, то перед или после вышеупомянутой строки добавьте еще одну: [vba]
Код
.Cells(1, n).NumberFormat = "mm/yyyy"
[/vba] или "mmm yyyy" - чтобы отображать "авг 2015", или "mmmm yyyy" - чтобы отображать "Август 2015", или "yyyy" - чтобы отображать только год, и т.д.KSV