Прокрутите листы и вставьте формулу на основе имени листа

На основании this thread и того, что там указано Томаса Мюллера , вы можете определить типы с теми же сигнатурами, что и методы, адреса которых вы хотите получить (для каждой перегрузки) , Если вы затем объявите переменные этих типов и назначите им указатели на объекты, вы убедитесь, что компилятор выбирает правильную перегрузку для вашего известного типа переменной и, кроме того, что она не будет игнорировать их, если они не будут использоваться нигде в коде (некоторые перегрузки не могут быть связаны в вашем двоичном коде).

Поэтому, основываясь на его идее, он может искать перегрузку функции MessageDlgPosHelp следующим образом:

type
  TMessageDlgPosHelp1 = function(const Msg: string; DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
    const HelpFileName: string): Integer;
  TMessageDlgPosHelp2 = function(const Msg: string; DlgType: TMsgDlgType;
    Buttons: TMsgDlgButtons; HelpCtx: Longint; X, Y: Integer;
    const HelpFileName: string; DefaultButton: TMsgDlgBtn): Integer;

procedure TForm1.Button1Click(Sender: TObject);
var
  MessageDlgPosHelp1: TMessageDlgPosHelp1;
  MessageDlgPosHelp2: TMessageDlgPosHelp2;
begin
  MessageDlgPosHelp1 := MessageDlgPosHelp;
  MessageDlgPosHelp2 := MessageDlgPosHelp;
  ShowMessage(Format('%p; %p', [@MessageDlgPosHelp1, @MessageDlgPosHelp2]));
end;

0
задан Pᴇʜ 7 March 2019 в 07:54
поделиться

1 ответ

Основная проблема заключается в том, что код в вашем цикле не ссылается на лист, поэтому по умолчанию будет применяться только к активному листу. И это никогда не меняется.

Если ссылка на лист находится не в том месте, возможно, вы сможете решить, как ее исправить.

Кроме того, если вы имеете дело с несколькими открытыми рабочими книгами, вы должны добавить ссылки на рабочие книги, а также ссылки на рабочие таблицы.

Sub test()
    Dim wsSheet As Worksheet
    Dim strFormulas As String
    Dim Lastrow As Long

    For Each wsSheet In Worksheets
        If wsSheet.Name = "Maintenance Formatting" Or wsSheet.Name = "Fuel Formatting" Then
            strFormulas = "=VLOOKUP(C2,[BillingReportMacros.xlsm]'" & wsSheet.Name & "'!$G:$J,4,FALSE)"
            Lastrow = wsSheet.Range("F1").CurrentRegion.Rows.Count + 1
            wsSheet.Range("A2:A" & Lastrow).Formula = strFormulas
        End If
    Next wsSheet

End Sub
0
ответ дан SJR 7 March 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: