Что нового

Запись переменных в двумерный массив

joparezzz

Новичок
Сообщения
65
Репутация
0
Написал программу, которая выводит в консоль значения переменных.
Каким образом можно эти значения записать в двумерный массив?
Код:
#include <Array.au3>
#include <Excel.au3>

Local $oExcel = _Excel_Open()
$SorceFile = "\Исходные данные.xlsx" 							;Путь к файлу с исходными данными
Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & $SorceFile) 	;Открываем файл с исходными данными
Local $oSheet = _Excel_SheetAdd($oWorkbook, 1, False, 1, "Лист2")

Local $aSB = ["Основание", "Каркас основания", "Ферма основания", "Планка крепежная площадки", "Колодец кабельных вводов"]

Local $LastRow = $oWorkbook.Sheets("Лист1").Range("A1").SpecialCells($xlCellTypeLastCell).Row ;Определяем последнюю строку
;ConsoleWrite ($LastRow & @CRLF)

Local $aArray = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.Sheets("Лист1").Usedrange.Columns("A:F"), 1)
;_ArrayDisplay($aArray)

For $i = 0 To UBound($aSB) - 1
	;ConsoleWrite ($aSB[$i]& @CRLF)
	For $j = 0 To $LastRow - 1
		$sRow = $j + 1
		$sPos = $aArray[$j][0]
		$sObozn = $aArray[$j][1]
		$sName = $aArray[$j][2]
		$sKol = $aArray[$j][3]
		$sRazd = $aArray[$j][4]
		If $sName = $aSB[$i] Then
			ConsoleWrite ($sRow & @TAB & $sPos & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)
				For $n = 1 To 200
					For $k = 1 To 200
						$sRowK = $sRow + $k
						$sPosK = $aArray[$sRowK][0]
						$sPosN = $sPos  & "." & $n
						$sObozn = $aArray[$sRowK][1]
						$sName = $aArray[$sRowK][2]
						$sKol = $aArray[$sRowK][3]
						$sRazd = $aArray[$sRowK][4]
						If $sPosN = $sPosK And $sRazd <> "Сборочные единицы" Then
							ConsoleWrite ($sRowK & @TAB &  $sPosK & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)
						Else
						EndIf
					Next
				Next

		Else
		EndIf

	Next
	;ConsoleWrite (@CRLF)
Next
 

Вложения

  • Исходные данные.zip
    24.3 КБ · Просмотры: 3
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Alofa сказал(а):
это массив из эксель файла.
Мне нужно из этого эксель файла определенный кусок в определенной последовательности.
Нужные данные у меня уже выводятся в консоли, мне надо эти данные записать в другой двумерный массив, для последующих манипуляций с этим массивом, и записи на другой лист экселевского файла

Вот эти переменные:
Код:
ConsoleWrite ($sRow & @TAB & $sPos & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)
ConsoleWrite ($sRowK & @TAB &  $sPosK & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)

записать в двумерный массив.


Добавлено:
Сообщение автоматически объединено:

Вытащил индексы (номера строк) из первого массива $aArray и записал их в другой массив $Array1.
Как теперь вытащить всю строку и массива $aArray по значениям строк записанным в $Array1 и добавить в третий двумерный массив?

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

Dim $Array1[0]

Local $oExcel = _Excel_Open()
$SorceFile = "\Исходные данные.xlsx" 									;Путь к файлу с исходными данными
Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & $SorceFile) 	;Открываем файл с исходными данными
Local $oSheet = _Excel_SheetAdd($oWorkbook, 1, False, 1, "Лист2")

Local $aSB = ["Основание", "Каркас основания", "Ферма основания", "Планка крепежная площадки", "Колодец кабельных вводов"]

Local $LastRow = $oWorkbook.Sheets("Лист1").Range("A1").SpecialCells($xlCellTypeLastCell).Row ;Определяем последнюю строку
;ConsoleWrite ($LastRow & @CRLF)

Local $aArray = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.Sheets("Лист1").Usedrange.Columns("A:F"), 1)
;_ArrayDisplay($aArray)

For $i = 0 To UBound($aSB) - 1
	;ConsoleWrite ($aSB[$i]& @CRLF)
	For $j = 0 To $LastRow - 1
		$sRow = $j + 1
		$sPos = $aArray[$j][0]
		$sObozn = $aArray[$j][1]
		$sName = $aArray[$j][2]
		$sKol = $aArray[$j][3]
		$sRazd = $aArray[$j][4]
		If $sName = $aSB[$i] Then
			ConsoleWrite ($sRow & @TAB & $sPos & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)
			_ArrayAdd($Array1, $sRow-1)
				For $n = 1 To 200
					For $k = 1 To 200
						$sRowK = $sRow + $k
						$sPosK = $aArray[$sRowK][0]
						$sPosN = $sPos  & "." & $n
						$sObozn = $aArray[$sRowK][1]
						$sName = $aArray[$sRowK][2]
						$sKol = $aArray[$sRowK][3]
						$sRazd = $aArray[$sRowK][4]
						If $sPosN = $sPosK And $sRazd <> "Сборочные единицы" Then
							ConsoleWrite ($sRowK & @TAB &  $sPosK & @TAB & $sObozn & @TAB & $sName & @TAB & $sKol & @TAB & $sRazd & @CRLF)
							_ArrayAdd($Array1, $sRowK-1)
						Else
						EndIf
					Next
				Next

		Else
		EndIf

	Next
	;ConsoleWrite (@CRLF)
Next

;_ArrayDisplay($aArray)
_ArrayDisplay($Array1)
 
A

Alofa

Гость
(Не вдавался в логику отбора строк)
Код:
#include <Array.au3>
#include <Excel.au3>

Local $oExcel = _Excel_Open(False)
$SorceFile = "\Исходные данные.xlsx" ;Путь к файлу с исходными данными
Local $oWorkbook = _Excel_BookOpen($oExcel, @ScriptDir & $SorceFile) ;Открываем файл с исходными данными
;Local $oSheet = _Excel_SheetAdd($oWorkbook, 1, False, 1, "Лист2")
Local $aSB[5] = ["Основание", "Каркас основания", "Ферма основания", "Планка крепежная площадки", "Колодец кабельных вводов"]
Local $aArray = _Excel_RangeRead($oWorkbook, Default, $oWorkbook.Sheets("Лист1").Usedrange.Columns("A:F"), 1)
_Excel_Close($oExcel, False)
;_ArrayDisplay($aArray)

Local $iColumn = UBound($aArray, 2), $aArray_2[0][$iColumn]

For $i = 0 To UBound($aSB) - 1
	For $j = 0 To UBound($aArray) - 1
		If Not StringCompare($aArray[$j][2], $aSB[$i]) Then
			_ReDim($aArray, $aArray_2, $j, $j + 1)
			For $n = 1 To 200
				For $k = 1 To 200
					$sRowK = $j + 1 + $k
					If (Not StringCompare($aArray[$j][0] & "." & $n, $aArray[$sRowK][0])) And StringCompare($aArray[$sRowK][4], "Сборочные единицы") Then
						_ReDim($aArray, $aArray_2, $sRowK, $sRowK)
						ExitLoop
					EndIf
				Next
			Next
		EndIf
	Next
Next

_ArrayDisplay($aArray_2, '$aArray_2')

Func _ReDim(ByRef $aArray, ByRef $aArray_2, $i, $j)
	Local $iUB = UBound($aArray_2)
	ReDim $aArray_2[$iUB + 1][$iColumn]
	$aArray_2[$iUB][0] = $j
	$aArray_2[$iUB][1] = $aArray[$i][0]
	$aArray_2[$iUB][2] = $aArray[$i][1]
	$aArray_2[$iUB][3] = $aArray[$i][2]
	$aArray_2[$iUB][4] = $aArray[$i][3]
	$aArray_2[$iUB][5] = $aArray[$i][4]
EndFunc   ;==>_ReDim
 
Автор
J

joparezzz

Новичок
Сообщения
65
Репутация
0
Спасибо) программа работает


Добавлено:
Сообщение автоматически объединено:

А отсортировать детали в пределах сборочной единицы по порядку увеличения значения в Col2 можно?


Добавлено:
Сообщение автоматически объединено:

Да, кстати надо $n и $k приравнять нулю в начале цикла 0, чтоб корректно работала.
 
A

Alofa

Гость
joparezzz
Считаю что возможно вы изначально выбрали не очень рациональный способ извлечения информации - хотя могу ошибаться, но скрипт работает медленно.
Было бы проще если вы детально объяснили (словами без скриптов) чего хотите и по какому принципу нужно достать информацию.
Но это уже не в рамках данной темы.
 
Верх