Макрос с возвращаемым значением обычно называется функцией макроса. Перед исправлением положения, если вы поместите выражение / значение без точки с запятой, оно вернет значение вызывающей стороне. Если возвращаемое значение находится в блоке if-else, то; будет необходимо.
По сути, вы можете сделать так, как вы предлагаете, и удалить% let tms = из макроса. И да, я верю, что это сработает со статусом назначения шансов.
%macro tms ;
%* Create a Timestamp ;
%let tms_date= %sysfunc(date(),yymmdd10.) ; %* Todays date ;
%let tms_time= %sysfunc(time(),time.) ; %* Current Time ;
%* Format mmddyyhhmmss ;
_%scan(&tms_date,1)%scan(&tms_date,2)%scan(&tms_date,3)%scan(&tms_time,1,:)%scan(&tms_time,2,:)%scan(&tms_time,3,:)
%mend;
%let tms=%tms;
%put **&tms**;
В качестве другого предложения вы можете несколько упростить код, используя функцию сжатия вместо функций% scan, подобных этой
%sysfunc(compress(_&tms_date.&tms_time,"-:"));