<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Splitby macro in SAS Programming</title>
    <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600946#M173780</link>
    <description>This is the log but same error.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;BR /&gt;&lt;BR /&gt;72&lt;BR /&gt;&lt;BR /&gt;73&lt;BR /&gt;&lt;BR /&gt;74 DATA NEWt1;&lt;BR /&gt;&lt;BR /&gt;75 INPUT SUBJ TRT $ AUCL AUCI CPEAK HALF TPEAK TLAG ;&lt;BR /&gt;&lt;BR /&gt;76 CARDS;&lt;BR /&gt;&lt;BR /&gt;NOTE: The data set WORK.NEWT1 has 3 observations and 8 variables.&lt;BR /&gt;&lt;BR /&gt;NOTE: DATA statement used (Total process time):&lt;BR /&gt;&lt;BR /&gt;real time 0.01 seconds&lt;BR /&gt;&lt;BR /&gt;cpu time 0.02 seconds&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;80 ;&lt;BR /&gt;&lt;BR /&gt;81 run;&lt;BR /&gt;&lt;BR /&gt;82&lt;BR /&gt;&lt;BR /&gt;83 %macro splitdsnbyobs(dsn,splitby);&lt;BR /&gt;&lt;BR /&gt;84 %local no_obs firstobs finalobs;&lt;BR /&gt;&lt;BR /&gt;85 %RecsInDS(&amp;amp;dsn,no_obs);&lt;BR /&gt;&lt;BR /&gt;86&lt;BR /&gt;&lt;BR /&gt;87 %do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby));&lt;BR /&gt;&lt;BR /&gt;88 /*calculate the first and final obs for each do loop iteration*/&lt;BR /&gt;&lt;BR /&gt;89 %let firstobs=%sysfunc(floor((&amp;amp;i.-1)*&amp;amp;splitby.+1));&lt;BR /&gt;&lt;BR /&gt;90 %let finalobs=%sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.));&lt;BR /&gt;&lt;BR /&gt;91 %let finalobs=%sysfunc(min(&amp;amp;finalobs,&amp;amp;no_obs));&lt;BR /&gt;&lt;BR /&gt;92&lt;BR /&gt;&lt;BR /&gt;93 /* keep the observations from firstobs= and obs=*/&lt;BR /&gt;&lt;BR /&gt;94 data &amp;amp;dsn.&amp;amp;i.;&lt;BR /&gt;&lt;BR /&gt;95 set &amp;amp;dsn (firstobs=&amp;amp;firstobs. obs=%finalobs.);&lt;BR /&gt;&lt;BR /&gt;96 run;&lt;BR /&gt;&lt;BR /&gt;97 %end;&lt;BR /&gt;&lt;BR /&gt;98 %mend splitdsnbyobs;&lt;BR /&gt;&lt;BR /&gt;99&lt;BR /&gt;&lt;BR /&gt;100 %splitdsnbyobs(newt1,1);&lt;BR /&gt;&lt;BR /&gt;NOTE: Line generated by the invoked macro "SPLITDSNBYOBS".&lt;BR /&gt;&lt;BR /&gt;100 %RecsInDS(&amp;amp;dsn,no_obs);&lt;BR /&gt;&lt;BR /&gt;_&lt;BR /&gt;&lt;BR /&gt;180&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent invocation of macro RECSINDS not resolved.&lt;BR /&gt;&lt;BR /&gt;ERROR 180-322: Statement is not valid or it is used out of proper order.&lt;BR /&gt;&lt;BR /&gt;ERROR: Argument 1 to function CEIL referenced by the %SYSFUNC or %QSYSFUNC&lt;BR /&gt;macro function is not a number.&lt;BR /&gt;&lt;BR /&gt;ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC&lt;BR /&gt;argument list. Execution of %SYSCALL statement or %SYSFUNC&lt;BR /&gt;&lt;BR /&gt;or %QSYSFUNC function reference is terminated.&lt;BR /&gt;&lt;BR /&gt;ERROR: A character operand was found in the %EVAL function or %IF condition&lt;BR /&gt;where a numeric operand is required. The condition was:&lt;BR /&gt;&lt;BR /&gt;%sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby))&lt;BR /&gt;&lt;BR /&gt;ERROR: The %TO value of the %DO I loop is invalid.&lt;BR /&gt;&lt;BR /&gt;ERROR: The macro SPLITDSNBYOBS will stop executing.&lt;BR /&gt;&lt;BR /&gt;101&lt;BR /&gt;&lt;BR /&gt;102 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;BR /&gt;&lt;BR /&gt;114&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;User: sasdemo&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
    <pubDate>Fri, 01 Nov 2019 12:54:19 GMT</pubDate>
    <dc:creator>jacksonan123</dc:creator>
    <dc:date>2019-11-01T12:54:19Z</dc:date>
    <item>
      <title>Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600879#M173756</link>
      <description>&lt;P&gt;I have a very simple data set newt1 and I get the following error.&amp;nbsp; What name should&lt;/P&gt;&lt;P&gt;I have used since I want it split by one record without the error?&lt;/P&gt;&lt;P&gt;subj&amp;nbsp;&amp;nbsp; time&amp;nbsp;&amp;nbsp;&amp;nbsp; cp&lt;/P&gt;&lt;P&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/P&gt;&lt;P&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0&lt;/P&gt;&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitdsnbyobs(newt1,1); 
%RecsInDS(&amp;amp;dsn,no_obs); /* Read more about this macro at http://sastechies.blogspot.com/2009/11/ways-to-count-number-of-obs-in-dataset.html */ 

/*calculate the final obs for each do loop iteration*/ 

%macro finalobs; 
 %if %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))) gt &amp;amp;no_obs %then &amp;amp;no_obs; 
 %else %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))); 
%mend finalobs; 
/* keep the observations from firstobs= and obs=*/ 
%do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby)); 
data &amp;amp;dsn.&amp;amp;i.; 
set &amp;amp;dsn (firstobs=%sysfunc(floor(%eval((&amp;amp;i.-1)*&amp;amp;splitby.+1))) obs=%finalobs); 
run; 
%end; 
%mend splitdsnbyobs; &lt;/CODE&gt;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;DIV class="sasSource"&gt;OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;/DIV&gt;&lt;DIV class="sasError"&gt;ERROR: Invalid macro parameter name 1. It should be a valid SAS identifier no longer than 32 characters.&lt;/DIV&gt;&lt;DIV class="sasError"&gt;ERROR: A dummy macro will be compiled.&lt;/DIV&gt;&lt;PRE class="sasLog"&gt;&amp;nbsp;&lt;/PRE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 01 Nov 2019 03:15:59 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600879#M173756</guid>
      <dc:creator>jacksonan123</dc:creator>
      <dc:date>2019-11-01T03:15:59Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600882#M173758</link>
      <description>&lt;P&gt;The second parameter is the name of a macro variable. 1 is not a valid name.&lt;/P&gt;</description>
      <pubDate>Fri, 01 Nov 2019 03:43:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600882#M173758</guid>
      <dc:creator>ChrisNZ</dc:creator>
      <dc:date>2019-11-01T03:43:24Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600887#M173761</link>
      <description>&lt;P&gt;There are many ways to tackle this, mine is but one...&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitds(data,parts);
data parts;
   if 0 then set &amp;amp;data nobs=nobs;
   do num=1 to &amp;amp;parts;
      if num=1 then do;
         firstobs=1;
         obs=ifn(num=&amp;amp;parts,nobs,int(nobs/&amp;amp;parts)*num);
         output;
      end;
      else do;
         firstobs=obs+1;
         obs=ifn(num=&amp;amp;parts,nobs,int(nobs/&amp;amp;parts)*num);
         output;
      end;
   end;
   stop;
   keep num firstobs obs;
run;

%* inner helper macro ;
%macro code;
   data dsn&amp;amp;num;
      set &amp;amp;data (firstobs=&amp;amp;firstobs obs=&amp;amp;obs);
   run;
%mend;
%loop_control(control=parts);
%mend;

%splitds(sashelp.zipcode,1)
%splitds(sashelp.zipcode,2)
%splitds(sashelp.zipcode,3)
%splitds(sashelp.zipcode,4)
&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;%loop_control and other utility macros:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/scottbass/SAS/blob/master/Macro/loop_control.sas" target="_blank"&gt;https://github.com/scottbass/SAS/blob/master/Macro/loop_control.sas&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 01 Nov 2019 04:59:40 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600887#M173761</guid>
      <dc:creator>ScottBass</dc:creator>
      <dc:date>2019-11-01T04:59:40Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600904#M173771</link>
      <description>&lt;P&gt;You have not posted your full code.&lt;/P&gt;
&lt;P&gt;You defined next line with two arguments that should include variable names&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitdsnbyobs(newt1,1); &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;suppose you want to split into &lt;STRONG&gt;3 datasets&lt;/STRONG&gt;&amp;nbsp;and your dataset name is &lt;STRONG&gt;newt1&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;then your code should be:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitdsnbyobs(dsn,splitby); /* defined macro with arguments to be used in code */
%RecsInDS(&amp;amp;dsn,no_obs); /* Read more about this macro at http://sastechies.blogspot.com/2009/11/ways-to-count-number-of-obs-in-dataset.html */ 

/*calculate the final obs for each do loop iteration*/ 

%macro finalobs; 
 %if %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))) gt &amp;amp;no_obs %then &amp;amp;no_obs; 
 %else %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))); 
%mend finalobs; 
/* keep the observations from firstobs= and obs=*/ 
%do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby)); 
data &amp;amp;dsn.&amp;amp;i.; 
set &amp;amp;dsn (firstobs=%sysfunc(floor(%eval((&amp;amp;i.-1)*&amp;amp;splitby.+1))) obs=%finalobs); 
run; 
%end; 
%mend splitdsnbyobs; 

%splitdsnbyobs(newt1,3); /* line added to execute the macro code */&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 01 Nov 2019 09:35:23 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600904#M173771</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2019-11-01T09:35:23Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600934#M173774</link>
      <description>I used your code with the following data set below (newt1) and got the&lt;BR /&gt;following error.&lt;BR /&gt;&lt;BR /&gt;100 %splitdsnbyobs(newt1,3); /* line added to execute the macro code&lt;BR /&gt;*/&lt;BR /&gt;&lt;BR /&gt;NOTE: Line generated by the invoked macro "SPLITDSNBYOBS".&lt;BR /&gt;&lt;BR /&gt;100 %RecsInDS(&amp;amp;dsn,no_obs); %macro finalobs; %if&lt;BR /&gt;%sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))) gt &amp;amp;no_obs %then &amp;amp;no_obs;&lt;BR /&gt;&lt;BR /&gt;_&lt;BR /&gt;&lt;BR /&gt;180&lt;BR /&gt;&lt;BR /&gt;100 ! %else %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))); %mend finalobs;&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent invocation of macro RECSINDS not resolved.&lt;BR /&gt;&lt;BR /&gt;ERROR 180-322: Statement is not valid or it is used out of proper order.&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent symbolic reference NO_OBS not resolved.&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent symbolic reference NO_OBS not resolved.&lt;BR /&gt;&lt;BR /&gt;ERROR: Argument 1 to function CEIL referenced by the %SYSFUNC or %QSYSFUNC&lt;BR /&gt;macro function is not a number.&lt;BR /&gt;&lt;BR /&gt;ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC&lt;BR /&gt;argument list. Execution of %SYSCALL statement or %SYSFUNC&lt;BR /&gt;&lt;BR /&gt;or %QSYSFUNC function reference is terminated.&lt;BR /&gt;&lt;BR /&gt;ERROR: A character operand was found in the %EVAL function or %IF condition&lt;BR /&gt;where a numeric operand is required. The condition was:&lt;BR /&gt;&lt;BR /&gt;%sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby))&lt;BR /&gt;&lt;BR /&gt;ERROR: The %TO value of the %DO I loop is invalid.&lt;BR /&gt;&lt;BR /&gt;ERROR: The macro SPLITDSNBYOBS will stop executing.&lt;BR /&gt;&lt;BR /&gt;101&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;DATA NEWt1;&lt;BR /&gt;&lt;BR /&gt;INPUT SUBJ TRT $ AUCL AUCI CPEAK HALF TPEAK TLAG ;&lt;BR /&gt;&lt;BR /&gt;CARDS;&lt;BR /&gt;&lt;BR /&gt;1 A 2079.16 2087.26 2556.76 1.1 1.5 1&lt;BR /&gt;&lt;BR /&gt;2 A 1377.26 . 777.38 . 8 8&lt;BR /&gt;&lt;BR /&gt;3 A 1899.42 1908.64 2002.591 1.13 1.5 1&lt;BR /&gt;&lt;BR /&gt;;&lt;BR /&gt;&lt;BR /&gt;run;&lt;BR /&gt;</description>
      <pubDate>Fri, 01 Nov 2019 11:55:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600934#M173774</guid>
      <dc:creator>jacksonan123</dc:creator>
      <dc:date>2019-11-01T11:55:19Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600936#M173776</link>
      <description>&lt;P&gt;I think that you don't need the&amp;nbsp;&lt;STRONG&gt;%eval&lt;/STRONG&gt; macro function under&amp;nbsp;&lt;STRONG&gt;%sysfunc.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Try next code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitdsnbyobs(dsn,splitby); /* defined macro with arguments to be used in code */
%RecsInDS(&amp;amp;dsn,no_obs); /* Read more about this macro at http://sastechies.blogspot.com/2009/11/ways-to-count-number-of-obs-in-dataset.html */ 

/*calculate the final obs for each do loop iteration*/ 

%macro finalobs; 
 %if %sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.)) gt &amp;amp;no_obs %then &amp;amp;no_obs; 
 %else %sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.)); 
%mend finalobs; 
/* keep the observations from firstobs= and obs=*/ 
%do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby)); 
data &amp;amp;dsn.&amp;amp;i.; 
set &amp;amp;dsn (firstobs=%sysfunc(floor(&amp;amp;i.-1)*&amp;amp;splitby.+1) obs=%finalobs); 
run; 
%end; 
%mend splitdsnbyobs; 

%splitdsnbyobs(newt1,3); /* line added to execute the macro code */&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 01 Nov 2019 12:19:24 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600936#M173776</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2019-11-01T12:19:24Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600937#M173777</link>
      <description>I got the following log with the same errors as before with new code same&lt;BR /&gt;data set.&lt;BR /&gt;&lt;BR /&gt;DATA NEWT1;&lt;BR /&gt;&lt;BR /&gt;INPUT SUBJ TRT $ AUCL AUCI CPEAK HALF TPEAK TLAG ;&lt;BR /&gt;&lt;BR /&gt;CARDS;&lt;BR /&gt;&lt;BR /&gt;1 A 2079.16 2087.26 2556.76 1.1 1.5 1&lt;BR /&gt;&lt;BR /&gt;2 A 1377.26 . 777.38 . 8 8&lt;BR /&gt;&lt;BR /&gt;3 A 1899.42 1908.64 2002.591 1.13 1.5 1&lt;BR /&gt;&lt;BR /&gt;;&lt;BR /&gt;&lt;BR /&gt;RUN;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;85 %macro splitdsnbyobs(dsn,splitby); /* defined macro with&lt;BR /&gt;arguments to be used in code */&lt;BR /&gt;86 %RecsInDS(&amp;amp;dsn,no_obs); /* Read more about this macro at&lt;BR /&gt;86 !&lt;BR /&gt;&lt;A href="http://sastechies.blogspot.com/2009/11/ways-to-count-number-of-obs-in-datase" target="_blank"&gt;http://sastechies.blogspot.com/2009/11/ways-to-count-number-of-obs-in-datase&lt;/A&gt;&lt;BR /&gt;t.html */&lt;BR /&gt;87&lt;BR /&gt;88 /*calculate the final obs for each do loop iteration*/&lt;BR /&gt;89&lt;BR /&gt;90 %macro finalobs;&lt;BR /&gt;91 %if %sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.)) gt &amp;amp;no_obs %then &amp;amp;no_obs;&lt;BR /&gt;92 %else %sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.));&lt;BR /&gt;93 %mend finalobs;&lt;BR /&gt;94 /* keep the observations from firstobs= and obs=*/&lt;BR /&gt;95 %do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby));&lt;BR /&gt;96 data &amp;amp;dsn.&amp;amp;i.;&lt;BR /&gt;97 set &amp;amp;dsn (firstobs=%sysfunc(floor(&amp;amp;i.-1)*&amp;amp;splitby.+1)&lt;BR /&gt;obs=%finalobs);&lt;BR /&gt;98 run;&lt;BR /&gt;99 %end;&lt;BR /&gt;100 %mend splitdsnbyobs;&lt;BR /&gt;101&lt;BR /&gt;102 %splitdsnbyobs(newt1,3); /* line added to execute the macro code&lt;BR /&gt;*/&lt;BR /&gt;NOTE: Line generated by the invoked macro "SPLITDSNBYOBS".&lt;BR /&gt;102 %RecsInDS(&amp;amp;dsn,no_obs); %macro finalobs; %if&lt;BR /&gt;%sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.)) gt &amp;amp;no_obs %then &amp;amp;no_obs; %else&lt;BR /&gt;_&lt;BR /&gt;180&lt;BR /&gt;102 ! %sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.)); %mend finalobs;&lt;BR /&gt;WARNING: Apparent invocation of macro RECSINDS not resolved.&lt;BR /&gt;MPRINT(SPLITDSNBYOBS): %RecsInDS(newt1,no_obs);&lt;BR /&gt;&lt;BR /&gt;ERROR 180-322: Statement is not valid or it is used out of proper order.&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent symbolic reference NO_OBS not resolved.&lt;BR /&gt;WARNING: Apparent symbolic reference NO_OBS not resolved.&lt;BR /&gt;ERROR: Argument 1 to function CEIL referenced by the %SYSFUNC or %QSYSFUNC&lt;BR /&gt;macro function is not a number.&lt;BR /&gt;ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC&lt;BR /&gt;argument list. Execution of %SYSCALL statement or %SYSFUNC&lt;BR /&gt;or %QSYSFUNC function reference is terminated.&lt;BR /&gt;ERROR: A character operand was found in the %EVAL function or %IF condition&lt;BR /&gt;where a numeric operand is required. The condition was:&lt;BR /&gt;%sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby))&lt;BR /&gt;ERROR: The %TO value of the %DO I loop is invalid.&lt;BR /&gt;ERROR: The macro SPLITDSNBYOBS will stop executing.&lt;BR /&gt;103&lt;BR /&gt;104 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Fri, 01 Nov 2019 12:31:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600937#M173777</guid>
      <dc:creator>jacksonan123</dc:creator>
      <dc:date>2019-11-01T12:31:19Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600941#M173778</link>
      <description>&lt;P&gt;The main issue is that mistakenly modified the DEFINITION of the macro by changing the parameter NAMES in the %MACRO statement.&amp;nbsp; Instead you want to pass in the values to use when you CALL the macro.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The macro is a little silly (over complicated? confused?) because it is trying to define another macro inside the body of the macro definition.&amp;nbsp; It never makes sense to define a macro inside of another macro.&amp;nbsp; The name space for macros is flat, not nested.&amp;nbsp; So a macro defined inside of another macro is the same as it would be if it was defined outside.&amp;nbsp; You don't need that macro as you can just do the %IF statement as part of the outer macro definition.&amp;nbsp; And you don't even need the %IF statement as all you doing is taking the MIN() of two numbers.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;So first simplify the macro definition.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro splitdsnbyobs(dsn,splitby); 
%local no_obs i firstobs finalobs;
%RecsInDS(&amp;amp;dsn,no_obs); 

%do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby)); 
/*calculate the first and final obs for each do loop iteration*/
  %let firstobs=%sysfunc(floor((&amp;amp;i.-1)*&amp;amp;splitby.+1));
  %let finalobs=%sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.));
  %let finalobs=%sysfunc(min(&amp;amp;finalobs,&amp;amp;no_obs)); 

/* keep the observations from firstobs= and obs=*/ 
data &amp;amp;dsn.&amp;amp;i.; 
  set &amp;amp;dsn (firstobs=&amp;amp;firstobs. obs=%finalobs.); 
run; 
%end; 
%mend splitdsnbyobs; &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Then try calling it.&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%splitdsnbyobs(newt1,1);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 01 Nov 2019 12:51:28 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600941#M173778</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2019-11-01T12:51:28Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600946#M173780</link>
      <description>This is the log but same error.&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;1 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;BR /&gt;&lt;BR /&gt;72&lt;BR /&gt;&lt;BR /&gt;73&lt;BR /&gt;&lt;BR /&gt;74 DATA NEWt1;&lt;BR /&gt;&lt;BR /&gt;75 INPUT SUBJ TRT $ AUCL AUCI CPEAK HALF TPEAK TLAG ;&lt;BR /&gt;&lt;BR /&gt;76 CARDS;&lt;BR /&gt;&lt;BR /&gt;NOTE: The data set WORK.NEWT1 has 3 observations and 8 variables.&lt;BR /&gt;&lt;BR /&gt;NOTE: DATA statement used (Total process time):&lt;BR /&gt;&lt;BR /&gt;real time 0.01 seconds&lt;BR /&gt;&lt;BR /&gt;cpu time 0.02 seconds&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;80 ;&lt;BR /&gt;&lt;BR /&gt;81 run;&lt;BR /&gt;&lt;BR /&gt;82&lt;BR /&gt;&lt;BR /&gt;83 %macro splitdsnbyobs(dsn,splitby);&lt;BR /&gt;&lt;BR /&gt;84 %local no_obs firstobs finalobs;&lt;BR /&gt;&lt;BR /&gt;85 %RecsInDS(&amp;amp;dsn,no_obs);&lt;BR /&gt;&lt;BR /&gt;86&lt;BR /&gt;&lt;BR /&gt;87 %do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby));&lt;BR /&gt;&lt;BR /&gt;88 /*calculate the first and final obs for each do loop iteration*/&lt;BR /&gt;&lt;BR /&gt;89 %let firstobs=%sysfunc(floor((&amp;amp;i.-1)*&amp;amp;splitby.+1));&lt;BR /&gt;&lt;BR /&gt;90 %let finalobs=%sysfunc(ceil(&amp;amp;i * &amp;amp;splitby.));&lt;BR /&gt;&lt;BR /&gt;91 %let finalobs=%sysfunc(min(&amp;amp;finalobs,&amp;amp;no_obs));&lt;BR /&gt;&lt;BR /&gt;92&lt;BR /&gt;&lt;BR /&gt;93 /* keep the observations from firstobs= and obs=*/&lt;BR /&gt;&lt;BR /&gt;94 data &amp;amp;dsn.&amp;amp;i.;&lt;BR /&gt;&lt;BR /&gt;95 set &amp;amp;dsn (firstobs=&amp;amp;firstobs. obs=%finalobs.);&lt;BR /&gt;&lt;BR /&gt;96 run;&lt;BR /&gt;&lt;BR /&gt;97 %end;&lt;BR /&gt;&lt;BR /&gt;98 %mend splitdsnbyobs;&lt;BR /&gt;&lt;BR /&gt;99&lt;BR /&gt;&lt;BR /&gt;100 %splitdsnbyobs(newt1,1);&lt;BR /&gt;&lt;BR /&gt;NOTE: Line generated by the invoked macro "SPLITDSNBYOBS".&lt;BR /&gt;&lt;BR /&gt;100 %RecsInDS(&amp;amp;dsn,no_obs);&lt;BR /&gt;&lt;BR /&gt;_&lt;BR /&gt;&lt;BR /&gt;180&lt;BR /&gt;&lt;BR /&gt;WARNING: Apparent invocation of macro RECSINDS not resolved.&lt;BR /&gt;&lt;BR /&gt;ERROR 180-322: Statement is not valid or it is used out of proper order.&lt;BR /&gt;&lt;BR /&gt;ERROR: Argument 1 to function CEIL referenced by the %SYSFUNC or %QSYSFUNC&lt;BR /&gt;macro function is not a number.&lt;BR /&gt;&lt;BR /&gt;ERROR: Invalid arguments detected in %SYSCALL, %SYSFUNC, or %QSYSFUNC&lt;BR /&gt;argument list. Execution of %SYSCALL statement or %SYSFUNC&lt;BR /&gt;&lt;BR /&gt;or %QSYSFUNC function reference is terminated.&lt;BR /&gt;&lt;BR /&gt;ERROR: A character operand was found in the %EVAL function or %IF condition&lt;BR /&gt;where a numeric operand is required. The condition was:&lt;BR /&gt;&lt;BR /&gt;%sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby))&lt;BR /&gt;&lt;BR /&gt;ERROR: The %TO value of the %DO I loop is invalid.&lt;BR /&gt;&lt;BR /&gt;ERROR: The macro SPLITDSNBYOBS will stop executing.&lt;BR /&gt;&lt;BR /&gt;101&lt;BR /&gt;&lt;BR /&gt;102 OPTIONS NONOTES NOSTIMER NOSOURCE NOSYNTAXCHECK;&lt;BR /&gt;&lt;BR /&gt;114&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;User: sasdemo&lt;BR /&gt;&lt;BR /&gt;&lt;BR /&gt;</description>
      <pubDate>Fri, 01 Nov 2019 12:54:19 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600946#M173780</guid>
      <dc:creator>jacksonan123</dc:creator>
      <dc:date>2019-11-01T12:54:19Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600999#M173791</link>
      <description>&lt;P&gt;Pay attention to next lines in the log:&lt;/P&gt;
&lt;PRE&gt;WARNING: Apparent invocation of macro RECSINDS not resolved.
MPRINT(SPLITDSNBYOBS): %RecsInDS(newt1,no_obs);

ERROR 180-322: Statement is not valid or it is used out of proper order.&lt;/PRE&gt;
&lt;P&gt;Macro RECSINDS - you need to copy it from the URL and include it into your code.&lt;/P&gt;
&lt;P&gt;I accept&amp;nbsp;&lt;a href="https://communities.sas.com/t5/user/viewprofilepage/user-id/159"&gt;@Tom&lt;/a&gt;'s note and suggest to reorganize the code:&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%macro RecsInDS( ....);
     ... copy macro fro the URL ...
%mend;

%macro finalobs; 
   %if %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))) gt &amp;amp;no_obs %then &amp;amp;no_obs; 
   %else %sysfunc(ceil(%eval(&amp;amp;i * &amp;amp;splitby.))); 
%mend finalobs; 

%macro splitdsnbyobs(dsn,splitby); 
    %RecsInDS(&amp;amp;dsn,no_obs);
   
    %do i=1 %to %sysfunc(ceil(&amp;amp;no_obs/&amp;amp;splitby)); 
           %finalobs;
           data &amp;amp;dsn.&amp;amp;i.; 
               set &amp;amp;dsn (firstobs=%sysfunc(floor(%eval((&amp;amp;i.-1)*&amp;amp;splitby.+1))) 
                              obs=%finalobs); 
            run; 
     %end; 
%mend splitdsnbyobs; 

%splitdsnbyobs(newt1,3);&lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;Pay attention, usage of a macro language is in two steps:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;1)&amp;nbsp; Macro &lt;U&gt;definition&lt;/U&gt; with macro &lt;U&gt;variables&lt;/U&gt; as arguments&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;%macro macro_name(arg_name, arg2_name, ...);&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;.... code uses &amp;amp;arg_name ...&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;%mend;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;2) Macro &lt;U&gt;execution&lt;/U&gt; with &lt;U&gt;values&lt;/U&gt; supplied in order of arguments:&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;STRONG&gt;%macro_name(.....);&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 01 Nov 2019 15:47:00 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/600999#M173791</guid>
      <dc:creator>Shmuel</dc:creator>
      <dc:date>2019-11-01T15:47:00Z</dc:date>
    </item>
    <item>
      <title>Re: Splitby macro</title>
      <link>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/601008#M173795</link>
      <description>&lt;P&gt;You cannot call a macro that you haven't defined. You either need to include the macro definition (or have it in your autocall library).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;But you don't need that macro. Replace&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;%RecsInDS(&amp;amp;dsn,no_obs); &lt;/CODE&gt;&lt;/PRE&gt;
&lt;P&gt;with&lt;/P&gt;
&lt;PRE&gt;&lt;CODE class=" language-sas"&gt;data _null_;
  call symputx('no_obs',no_obs);
  stop;
  set &amp;amp;dsn nobs=no_obs;
run;&lt;/CODE&gt;&lt;/PRE&gt;</description>
      <pubDate>Fri, 01 Nov 2019 16:15:41 GMT</pubDate>
      <guid>https://communities.sas.com/t5/SAS-Programming/Splitby-macro/m-p/601008#M173795</guid>
      <dc:creator>Tom</dc:creator>
      <dc:date>2019-11-01T16:15:41Z</dc:date>
    </item>
  </channel>
</rss>

