Что нового

[Массивы] Работа с массивом из Экселя (_ExcelReadSheetToArray)

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
Здравствуйте!
Подскажите в чем подвох?
Есть файл экселя такого содержания

1 Коля Иванов
2 Петя Сидоров
3 Вася Барашкин
4 Оля Тихонькая
5 Таня Зорина
6 Коля Трехин
7 Петя Козликов
8 Валя Друникова
9 Катя Сотникова
10 Катя Дубцова

С помощью _ExcelReadSheetToArray делаю массив.
Проверяю вывод массива _ArrayDisplay
Вроде все корректно.

[1]|1|Коля|Иванов|
[2]|2|Петя|Сидоров|
[3]|3|Вася|Барашкин|
[4]|4|Оля|Тихонькая|
[5]|5|Таня|Зорина|
[6]|6|Коля|Трехин|
[7]|7|Петя|Козликов|
[8]|8|Валя|Друникова|
[9]|9|Катя|Сотникова|
[10]|10|Катя|Дубцова||

Далее например идет вот такой вот код:

Код:
#include <ComboConstants.au3>
#include <GUIConstants.au3>
#include <Array.au3>
#include <Excel.au3>

$sFilePath = (@ScriptDir & "\Accounts.xls")
$oExcel = _ExcelBookOpen($sFilePath, 0)
$aAccount = _ExcelReadSheetToArray($oExcel, 1, 1, 0, 0, True)
_ArrayDisplay($aAccount)
_ExcelBookClose($oExcel)

GUICreate ("test", 240, 160)
;~ *******************************************************
$Account1 = GUICtrlCreateCombo ("", 20, 20, 50, 20)
;~ *******************************************************
$Account2 = GUICtrlCreateCombo ("", 20, 50, 200, 20)
;~ *******************************************************
$Account3 = GUICtrlCreateCombo ("", 20, 80, 200, 20)
;~ *******************************************************
$bEnter = GUICtrlCreateButton ("GO!", 65, 120, 120, 30)
;~ *******************************************************

Sleep(50)
_DataSetCombo1 ()
Sleep(50)
_GetIndexAccount1 ()

GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			ExitLoop
		Case $Account1
			_GetIndexAccount1 ()

		Case $Account2
			_GetIndexAccount2 ()

		Case $Account3
			_GetIndexAccount3 ()

		Case $bEnter
			$rAccount1 = GUICtrlRead ($Account1)
			$rAccount2 = GUICtrlRead ($Account2)
			$rAccount3 = GUICtrlRead ($Account3)

			MsgBox (48, "User", $rAccount1 & " - " & $rAccount2 & " " & $rAccount3)
	EndSwitch
WEnd

Func _DataSetCombo1 ()
	For $i = 1 To 11 - 1
		GUICtrlSetData ($Account1, $aAccount[$i][0], $aAccount[1][0])
		GUICtrlSetData ($Account2, $aAccount[$i][1], $aAccount[1][1])
		GUICtrlSetData ($Account3, $aAccount[$i][2], $aAccount[1][2])
	Next
EndFunc

Func _GetIndexAccount1 ()
	$n = GUICtrlSendMsg ($Account1, $CB_GETCURSEL,-1,0)
	GUICtrlSetData ($Account2, $aAccount[$n+1][1])
	GUICtrlSetData ($Account3, $aAccount[$n+1][2])
EndFunc

Func _GetIndexAccount2 ()
	$n = GUICtrlSendMsg ($Account2, $CB_GETCURSEL,-1,0)
	GUICtrlSetData ($Account1, $aAccount[$n+1][0])
	GUICtrlSetData ($Account3, $aAccount[$n+1][2])
EndFunc

Func _GetIndexAccount3 ()
	$n = GUICtrlSendMsg ($Account2, $CB_GETCURSEL,-1,0)
	GUICtrlSetData ($Account1, $aAccount[$n+1][0])
	GUICtrlSetData ($Account2, $aAccount[$n+1][1])
EndFunc


И вижу в комбобоксе, что колонка с именами искажена!
Если встречались одинаковые значения то они воспринимаються как одно и размер колонки массива сокращается :scratch: (все повторы не выводяться)
и соответственно весь код работает неккоректно.

Что посоветуете?
Это глюк, или я что то не учел?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
panda_911 [?]
Подскажите в чем подвох?
Код:
Func _DataSetCombo1 ()
    For $i = 1 To 11 - 1
        GUICtrlSetData($Account1, $aAccount[$i][0] & '|', $aAccount[1][0])
        GUICtrlSetData($Account2, $aAccount[$i][1] & '|', $aAccount[1][1])
        GUICtrlSetData($Account3, $aAccount[$i][2] & '|', $aAccount[1][2])
    Next
EndFunc
 
Автор
P

panda_911

Только вверх, только вперед!
Сообщения
52
Репутация
8
2Garrett - Огромное спасибо!
Все работает.
А не могли бы обьяснить зачем добавлять '|' ?
И почему сьедаются именно идентичные значения?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
panda_911 [?]
А не могли бы обьяснить зачем добавлять '|' ?
Этот символ является сепаратором по умолчанию для пунктов Combo.
Код:
GUICtrlCreateCombo ("1|2|3|4", 20, 20, 50, 20)

Если его не задавать, то сформируется один пункт.
Код:
GUICtrlCreateCombo("1 2", 10, 10)
 
Верх