%macro crt_dynamic_fmt(din=, st=, lbl=, fmtname=); **** create dynamic format ****; proc sort data=&din out=&fmtname nodupkey; by &st; run; data &fmtname; set &fmtname; retain fmtname type; fmtname="&fmtname"; type='N'; length start $200 label $200; start=strip(put(&st, best.)); label=&lbl; keep fmtname type start label; run; proc format cntlin=&fmtname; run; %mend crt_dynamic_fmt; %crt_dynamic_fmt(din=fin, st=avisitn, lbl=avisit, fmtname=visn);