VarArrayCreate + Excel

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Ответить
Alexxx
Сообщения: 8
Зарегистрирован: 24 авг 2004, 16:16

16 сен 2004, 15:05

Помогите кто сможет-
делаю:

var
aData: Variant;
S: String;

begin

aData := VarArrayCreate([1, 5], VarVariant);
FRange := RSheet.Range['A1:A5'];
aData := FRange.Value; // работает

S:= aData[1]; // НЕ РАБОТАЕТ!

end;
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

17 сен 2004, 03:08

Ну-у-у, тут все просто!
aData := VarArrayCreate([1, 5], VarVariant);
Это лишний оператор. Так как по aData := FRange.Value; создается двумерный массив.
Чтобы в этом убедиться используйте

VarArrayLowBound(aData,1); VarArrayHighBound(aData,1);
VarArrayLowBound(aData,2); VarArrayHighBound(aData,2);

Например

Код: Выделить всё

for i:=VarArrayLowBound(aData,1) to VarArrayHighBound(aData,1) do
  for j:=VarArrayLowBound(aData,2) to VarArrayHighBound(aData,2) do begin
      ........ aData[i,j] ..............
end;
Вот пример кода, где производится и запись массива на лист и извлечение массива из листа:

Код: Выделить всё

procedure TForm1.Button1Click(Sender: TObject);
var
  aData: Variant;
  S: String;
  FBook,FSheet,FRange: Variant;

begin
  ExcelApplication1.Visible[1] := true;
  FBook:=ExcelApplication1.Workbooks;
  FBook:=FBook.add;
  FSheet:=FBook.WorkSheets[1];
  FSheet.Range['a1:c5'].value:=VarArrayOf([1, 10, 100]);
  FSheet.Range['a2'].value:=123;
  FSheet.Range['a3'].value:=123;

//  aData := VarArrayCreate([1, 3], VarVariant); <--- Это ЛИШНЕЕ!!!
  aData := FSheet.Range['A1:C1'].Value;
  if varIsArray(aData) then showmessage('array') else showmessage('scalar');
  s:=aData[1,2];
  showmessage(s);
  FBook.Close(false);
end;

Alexxx
Сообщения: 8
Зарегистрирован: 24 авг 2004, 16:16

17 сен 2004, 13:21

спасибо, все так и работает,
а то замучился длинные листы читать по ячейкам!
Ответить