То, что вы пытаетесь использовать, - alloca
. Объект va_list
не может хранить переменные, вызов функции хранит их, и вы можете обращаться к нему только через va_list. Эти переменные действительны только во время вызова, и после этого они получают ovverwriten.
ЭТО НЕ РАБОТАЕТ:
va_list func(int dummy, ...)
{
va_list result;
va_start(result, dummy);
return result;
}
Чтобы выделить память в стеке, без необходимости писать переменную функции используют alloca
. Он работает более или менее как malloc
, но вам не нужно вызывать free
, он автоматически освобождается, когда вы покидаете область действия.
int * local = (int *) alloca(3 * sizeof(int));
local[0] = 10;
local[1] = 20;
local[2] = 30;
Это принципиально то же самое, что писать
int local[3];
local[0] = 10;
local[1] = 20;
local[2] = 30;
Но с alloca
3 не обязательно должна быть константа. Опять же, вы можете использовать его только внутри области приложения, поэтому не возвращайте его из функции.
, если вы хотите из va_list, это несколько типов в одном списке, подумайте о том, как написать такой союз:
union variant
{
int i;
unsigned int u;
float f;
double d;
const char * s;
void * v;
};
В этом случае вы можете перебрать каждый лист во вновь открывшейся книге и проверить, что имя содержит строку CLS
.
Do While strExtension <> ""
Set wbOpen = Workbooks.Open(strPath & strExtension)
Dim checkSheet as Worksheet
For each checkSheet in wbOpen.Worksheets
If UCase$(checkSheet.Name) Like "*CLS*" Then
checkSheet.Copy After:=wbNew.Sheets(wbNew.Sheets.Count)
wbNew.Sheets(wbNew.Sheets.Count).Name = wbNew.Sheets(wbNew.Sheets.Count).Cells(1, 1)
End If
Next
wbOpen.Close SaveChanges:=False
strExtension = Dir
Loop