Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

Showing results for

- Home
- /
- Programming
- /
- Programming
- /
- Change macro variable with each iteration (plus and minus)

Options

- RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

☑ This topic is **solved**.
Need further help from the community? Please
sign in and ask a **new** question.

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Posted 08-30-2022 12:32 AM
(368 views)

I would like a macro variable that is referenced to change -1 and +1 with each iteration. For example in the following loop, each iteration from the start year of 2011 to the end year of 2013 should give the year minus 1 (YM1), the year (Y), and the year plus 1 (YP1).

```
%macro Loop_year(startyear=, endyear=);
%DO I = &startyear %TO &endyear;
%put YM1 is &I-1;
%put Y is &I;
%put YP1 is &I+1;
%end;
%mend Loop_year;
%Loop_year(startyear=2011, endyear=2013);
```

**This is what I get:**

YM1 is 2011-1

Y is 2011

YP1 is 2011+1

YM1 is 2012-1

Y is 2012

YP1 is 2012+1

YM1 is 2013-1

Y is 2013

YP1 is 2013+1

**But this is what I want:**

YM1 is 2010

Y is 2011

YP1 is 2012

YM1 is 2011

Y is 2012

YP1 is 2013

YM1 is 2012

Y is 2013

YP1 is 2014

Would this be possible? Thanks in advance

1 ACCEPTED SOLUTION

Accepted Solutions

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Like this?

```
%macro Loop_year(startyear=, endyear=);
%DO I = &startyear %TO &endyear;
%put YM1 is %eval(&I-1);
%put Y is &I;
%put YP1 is %eval(&I+1);
%end;
%mend Loop_year;
%Loop_year(startyear=2011, endyear=2013);
```

**Result:**

YM1 is 2010 Y is 2011 YP1 is 2012 YM1 is 2011 Y is 2012 YP1 is 2013 YM1 is 2012 Y is 2013 YP1 is 2014

2 REPLIES 2

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Like this?

```
%macro Loop_year(startyear=, endyear=);
%DO I = &startyear %TO &endyear;
%put YM1 is %eval(&I-1);
%put Y is &I;
%put YP1 is %eval(&I+1);
%end;
%mend Loop_year;
%Loop_year(startyear=2011, endyear=2013);
```

**Result:**

YM1 is 2010 Y is 2011 YP1 is 2012 YM1 is 2011 Y is 2012 YP1 is 2013 YM1 is 2012 Y is 2013 YP1 is 2014

- Mark as New
- Bookmark
- Subscribe
- Mute
- RSS Feed
- Permalink
- Report Inappropriate Content

Exactly, thank you! The %eval() is what I was looking for.

Build your skills. Make connections. Enjoy creative freedom. Maybe change the world. **Registration is now open through August 30th**. Visit the SAS Hackathon homepage.

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.