Delphi Excel

Добрый день!
Делаю табель 1/2 месяца с автозаполнением
Delphi 10.4
На форме DateTimePicker1
Мне необходимо, если сб или вск в ячейку записывалась буква “В”

for i := 1 to 15 do
  begin
    Inc(d);
    if day = 7 then
      day := 1;
    day := DayOfWeek(DateTimePicker1.Date) + d;
    if (day = 7) or (day = 1) then
    begin
      ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4+ i * 4].Value := 'Вых';
      ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := '0';
    end
    else
    begin
      ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := 'Раб';
      ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1, 4 + i * 4].Value := '1';
    end;
  end;

Есть две проблемы, которые я не могу решить:

  1. вск не записывается, как “В”, из-за того, что day = 8, хотя условие if day = 7 then day := 1, прописываю, не могу понять что не так
  2. Если я на DateTimePicker1 выбираю первый день, то работает с учетом проблемы №1,
    если на компоненте я выбираю, например 9 число, то отсчет идет с этого числа, не учитываются предыдущие 8 дней. Мне необходимо проходить по всему выбранному месяцу. Как реализовать тоже не могу сообразить
    Буду благодарна любой помощи

В таких случаях не нужен искусственный дополнительный счетчик внутри цикла,
нужно проверять остаток от деления на семь, например: (i + day - 1) mod 7;
если речь о первых 15-ти днях, нужно перед циклом вычислить день недели 1-го дня месяца.

Может лучше реализовать все это через БД + ADO? Я делаю табель

Да, в БД создайте таблицу дат с вказанием какой день. И тогда во время создания табеля просто тянуть запросом с БД информацию является ли конкретный день рабочим или выходным.
Кстати, таблицу перед импортом в БД, можно создать на листе Excel - в одном столбце даты, в другом столбце отмечаете Рабочий/Выходной

Спасибо, буду пробовать!

Что-то я не могу додуматься, мозг вскипает уже
Хочу вывести 30 дней по 15, те в две строки
Но некорректно выводит

if cds.RecordCount > 0 then
  begin
    cds.First;
    while not cds.Eof do
    begin
      for i := 1 to 15 do
        for j := 1 to 2 do
        begin
          ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
            cds.FieldByName('Data').AsString;
          ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
           cds.FieldByName('weekend').AsString;
          cds.Next;
        end;
    end;
  end;

Ну так бы показали как именно выводит и как ожидали получить

Вот так выводит

Вот так хочу получить
image

@Nadya, попробуйте такой код:

if cds.RecordCount > 0 then
  begin
    cds.First;
    i:=1;
    j:=1;
    while not cds.Eof do
    begin
       ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j, i] :=
            cds.FieldByName('Data').AsString;
       ExcelApp.WorkBooks[1].WorkSheets[1].Cells[j+1, i] :=
            DM.cds.FieldByName('weekend').AsString;
       cds.Next;

       Inc(i);
       if i>15 then begin Inc(j,2); i:=1 end;
    end;
 end;

Сделала вот так

j := i;
    if j > 15 then
      j := j - 15;
    ExcelApp.WorkBooks[1].WorkSheets[1].Cells[1 + (i DIV 16) * 3, j] :=
      cds.FieldByName('Data').AsString;