1

Тема: AHK: Странное поведение при работе с Excel

Здравствуйте!
Есть код, который должен заполнять ячейки таблицы excel.

loop 5 {
	row := A_Index
	loop 3 {
		col := A_Index
		Xl.Cells(row, col).Value := "R" . row . "C" . col
	}
}

При запуске вылетает ошибка 0x800a03ec.

Так работает:

Xl.Cells(row, 1).Value := "R" . row . "C" . col

Так тоже работает:

Xl.Cells(row, A_Index).Value := "R" . row . "C" . col

Почему я не могу использовать переменную в качестве второго параметра?
И почему могу - в качестве первого?
И почему таки могу в качестве второго, если ее имя - A_Index?

2

Re: AHK: Странное поведение при работе с Excel

Если судить по тому коду, что вы привели, содержание col и A_Index идентично, ничего другого сказать нельзя.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Странное поведение при работе с Excel

Я снова не понимаю, почему это произошло, но вот в таком виде заработало:

loop 5 {
	row := A_Index
	loop 3 {
		tmp := [A_Index]
		col := tmp[1]
		Xl.Cells(row, col).Value := "R" . row . "C" . col
	}
}

И вот так тоже работает:

col := Floor(A_Index)

Короче, происходит что-то непонятное с типами данных.
A_Index - число;
row := A_Index - тоже число;
col := A_Index - внезапно строка;
col := Floor(A_Index) - число.

Есть ли в Autohotkey надежный способ узнать, какой тип данных в данный момент хранится в переменной?

4

Re: AHK: Странное поведение при работе с Excel

KepocuH пишет:

col := A_Index - внезапно строка

Это вы как определили?

KepocuH пишет:

Есть ли в Autohotkey надежный способ узнать, какой тип данных в данный момент хранится в переменной?

var := 5
MsgBox % var + 0 = "" ? "Не число" : "Число"

Также If var is [not] type.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Странное поведение при работе с Excel

Удалось воспроизвести проблему, действительно, странное поведение.

if !Excel := Excel_Get()
   Return

XLSht := Excel.ActiveSheet

loop 2 {
   row := A_Index
   loop 2 {
      col := A_Index
      XLSht.Cells(row, col).Value := "test"
   }
}

Excel_Get(WinTitle := "ahk_class XLMAIN")  {
   ControlGet, hwnd, hwnd,, Excel71, %WinTitle%
   if !hwnd
      return
   Window := AccObjectFromWindow(hwnd, -16)
   Loop  {
      try Application := Window.Application
      catch
         ControlSend, Excel71, {esc}, %WinTitle%
   } Until !!Application
   return Application
}

AccObjectFromWindow(hWnd, idObject = 0)
{
   static IID_IDispatch   := "{00020400-0000-0000-C000-000000000046}"
        , IID_IAccessible := "{618736E0-3C3D-11CF-810C-00AA00389B71}"
        , OBJID_NATIVEOM  := 0xFFFFFFF0, VT_DISPATCH := 9, F_OWNVALUE := 1
        , h := DllCall("LoadLibrary", Str, "oleacc", Ptr)
        
   VarSetCapacity(IID, 16), idObject &= 0xFFFFFFFF
   DllCall("ole32\CLSIDFromString", Str, idObject = OBJID_NATIVEOM ? IID_IDispatch : IID_IAccessible, Ptr, &IID)
   if DllCall("oleacc\AccessibleObjectFromWindow", Ptr, hWnd, UInt, idObject, Ptr, &IID, PtrP, pAcc) = 0
      Return ComObjEnwrap(VT_DISPATCH, pAcc, F_OWNVALUE)
}

Работает, если заменить col := A_Index на col := A_Index + 0.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Странное поведение при работе с Excel

Задал вопрос, может, кто знает.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Странное поведение при работе с Excel

teadrinker пишет:
KepocuH пишет:

col := A_Index - внезапно строка

Это вы как определили?

Достоверно не определил, просто по аналогии:
col:=1 работает, col:="1" выдает ошибку 0x800a03ec.

teadrinker пишет:

Также If var is [not] type.

К сожалению, работает не совсем как надо. Не помогает отличить число от строки, состоящей из цифр.
Этот код выведет "Число". Дважды.

var := "1"
if var is integer 
	MsgBox Число
MsgBox % var + 0 = "" ? "Не число" : "Число"

col := A_Index + 0
Вот этот способ приведения строки к числу, пожалуй, самый простой. Спасибо!
За топик на autohotkey.com тоже спасибо.