На основании 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;
Основная проблема заключается в том, что код в вашем цикле не ссылается на лист, поэтому по умолчанию будет применяться только к активному листу. И это никогда не меняется.
Если ссылка на лист находится не в том месте, возможно, вы сможете решить, как ее исправить.
Кроме того, если вы имеете дело с несколькими открытыми рабочими книгами, вы должны добавить ссылки на рабочие книги, а также ссылки на рабочие таблицы.
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