2014-04-15 1 views
0

У меня вопрос о том, как использовать значение из базы данных SAS в другой команде. В моем случае у меня есть база данных с двумя переменными (ячейка и res). «Ячейка» содержит ссылку на ячейку в листе Excel, где должно быть скопировано значение «res».SAS: использование oberservation

Поэтому я хотел бы использовать значение, хранящееся в ячейке, в моей команде, связанной с листом Excel. Этот код не работает (конкатенации с || не работает.) Сообщение

DATA _null_; 
SET test; 
FILENAME ExcelTmp DDE "EXCEL|[&myInputTemplate.]&mySheet.!" || cell; 
FILE ExcelTmp NOTAB LRECL=7000; 
PUT res; 
RUN; 

Ошибка:

ERROR 23-2: Invalid option name ||. 

1491! DDE "EXCEL|[&myInputTemplate.]&mySheet.!" || cell; 
ERROR: Error in the FILENAME statement. 
ERROR 23-2: Invalid option name cell. 

1492  FILE ExcelTmp NOTAB LRECL=7000; 
ERROR 23-2: Invalid option name NOTAB. 

Если я пишу

FILENAME ExcelTmp DDE "EXCEL|[&myInputTemplate.]&mySheet.!R1C1:R1C1"; 

то значение записывается в ячейку A1 в Excel.

Есть ли аналогичный подход, который работает без вызова макроса?

Благодарим за помощь!

Christoph

+0

Я бы посмотрел на ваше утверждение 'filename', что-то не так с синтаксисом. Вы не пропустили '' '' после слова 'Excel'? – rambles

+0

Это поможет, если вы разместили фактическое сообщение об ошибке – mjsqu

ответ

1

Обычный способ использовать значения из набора данных как части команды/утверждения CALL EXECUTE процедура:

DATA _null_; 
    SET test; 
    call execute("DATA _NULL_;"); 
    call execute(cats("FILENAME ExcelTmp DDE ""EXCEL|[&myInputTemplate.]&mySheet.!",cell,""";")); 
    call execute("FILE ExcelTmp NOTAB LRECL=7000;"); 
    call execute("PUT '"||res||"';"); 
    call execute("RUN;"); 
run; 

Этот код генерирует DATA-шаги, которые сложены в буфер и будет выполнен после выполнения вышеописанного шага. Таким образом, в основном вы создадите столько DATA NULL шагов, поскольку у вас есть записи в вашем наборе данных test.

0

Предполагая, что вы пытаетесь обновить несколько ячеек, и cell в виде RnCn, что-то подобное может работать ...

Кроме того, необходимо определить диапазон ячеек заранее, например, R2C2: R100: C5.

 
%LET RANGE = R2C2:R100C5 ; 

DATA _null_; 
SET test; 
FILENAME ExcelTmp DDE "EXCEL|[&myInputTemplate.]&mySheet.!&RANGE" ; 
FILE ExcelTmp NOTAB LRECL=7000; 
put "[select(""" cell """)]" ; 
PUT res; 
RUN; 
+0

Привет, Фактически« ячейка »находится в формате диапазона« RnCn: RnCn ». легко изменить код, чтобы ваш подход работал. Однако я бы предпочел не указывать статический диапазон в начале. Вот почему я задаюсь вопросом, можно ли читать диапазон как одну ячейку для каждого наблюдения из базы данных. – Enkidu