Comparing 2 excel Files takes Forever to finish Topic is solved

Get help with using AutoHotkey (v1.1 and older) and its commands and hotkeys
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Comparing 2 excel Files takes Forever to finish

10 Jan 2019, 00:55

I have this 2 Excel Files i need to compare
1 file is over a million rows, the other file is over 38k rows..
with the script i made, its like this,
it takes
1 day = 300rows (excel 1) to go through all 38K rows (excel 2)
i tried to compute how many days can i run at least 50K rows(on Excel 1) to go through all 38K on (Excel2).
my computation gave me 3 months! i cannot do that!!!!
i tried researching how to make it faster, and i think i need to fileread on memory and put it on array, instead of directly reading on excel...
Heres the Catch... I NEVER TRIED USING ARRAY AND FILEREAD

Can someone Please help me rework my script so that i can finish my work faster? please

Heres my code:

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

	
fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
InputBox, ccc,Enter Last Row!,,,180,100,880,540

xl := ComObjCreate("Excel.Application") 			
oWorkBook := xl.Workbooks.Open(fileCh)
lstrw := oWorkBook.ActiveSheet.UsedRange.rows.count

	

	
xl2 := ComObjCreate("Excel.Application") 			
oWorkBook2 := xl2.Workbooks.Open(fileDh)
lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
	Gosub, byuwer
	Goto, trytry

Return

trytry:
	Loop, %lstrw%
	{
	ChX := oWorkbook.ActiveSheet.Range("K"cc).Value
	ChY := oWorkbook.ActiveSheet.Range("L"cc).Value
	ChZ := oWorkbook.ActiveSheet.Range("M"cc).Value
	ChID := oWorkbook.ActiveSheet.Range("H"cc).Value
		
	DhX := oWorkbook2.ActiveSheet.Range("X"ccc).Value
	DhY := oWorkbook2.ActiveSheet.Range("Y"ccc).Value
	DhZ := oWorkbook2.ActiveSheet.Range("Z"ccc).Value
	DhID := oWorkbook2.ActiveSheet.Range("A"ccc).Value
	DhCHAPA := oWorkbook2.ActiveSheet.Range("F"ccc).Value

qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2
	
			sagot := SQRT(qX + qY + qZ)
				
			if(sagot<=5)
{
if(sagot>0)
				{
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
				}
}


				
cc:=cc+1
GuiControl,20:,N1,%cc%
GuiControl,20:,N2,%ccc%
}
Goto, trytry2
Return


trytry2:
			if(ccc<=lstrw2)
				{
					ccc:=ccc+1
					cc:= 2
					FileAppend, `n%ccc%,%A_WorkingDir%\LastDDH.txt

						GoTo, trytry
					}
					
				oWorkbook.Close(1) 
				xl.Quit()
				oWorkbook2.Close(1) 
				xl2.Quit()
				FileAppend, Done on `n%A_ComputerName%,%A_WorkingDir%\Computer Done.txt
Shutdown, 9
				exitapp

Return

byuwer:
	Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return


GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return


Please please help!

Warning!, if you do test my code, keep in mind after finishing, the script will shutdown the computer
User avatar
Thoughtfu1Tux
Posts: 125
Joined: 31 May 2018, 23:26

Re: Comparing 2 excel Files takes Forever to finish

10 Jan 2019, 01:42

That's a ton of data... Why not just use PowerQuery and some formulas to compare the two workbooks?
IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

10 Jan 2019, 02:07

.
Last edited by IMEime on 13 Jan 2019, 15:02, edited 1 time in total.
User avatar
FanaticGuru
Posts: 1907
Joined: 30 Sep 2013, 22:25

Re: Comparing 2 excel Files takes Forever to finish

10 Jan 2019, 14:48

ktbjx wrote:
10 Jan 2019, 00:55
I have this 2 Excel Files i need to compare
1 file is over a million rows, the other file is over 38k rows..
i tried researching how to make it faster, and i think i need to fileread on memory and put it on array, instead of directly reading on excel...

A SafeArray is what you are looking for. It is a special array structure that Excel Com creates when a Range of Values are assigned to a variable. It is a little different than a standard AHK array structure but pretty close.

Here is an example of loading in data to a SafeArray and then looping through that array.

Code: Select all

xlApp := ComObjActive("Excel.Application")
LastRow := xlApp.ActiveSheet.UsedRange.Rows.Count
SafeArray_XYZ := xlApp.Range("K1:M" LastRow).Value
Loop % LastRow
{
	MsgBox % " Row: " A_Index "`tX`t" SafeArray_XYZ[A_Index, 1] ; row, column of array; X
	MsgBox % " Row: " A_Index "`tY`t" SafeArray_XYZ[A_Index, 2] ; row, column of array; Y
	MsgBox % " Row: " A_Index "`tZ`t" SafeArray_XYZ[A_Index, 3] ; row, column of array; Z
}

You can create separate SafeArrays for the columns you want or you could create one large SafeArray that gets even the columns inbetween that you don't need if memory is not an issue.

Loading the data needed all at once into memory and then looping through the array in memory should be much quicker. It is still a lot of data though and I did not study your code to see if you the checking process could be done more efficiently.

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts
AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon
Hotstring Manager - Create and Manage Hotstrings
[Class] WinHook - Create Window Shell Hooks and Window Event Hooks
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Re: Comparing 2 excel Files takes Forever to finish

10 Jan 2019, 22:00

FanaticGuru wrote:
10 Jan 2019, 14:48
A SafeArray is what you are looking for. It is a special array structure that Excel Com creates when a Range of Values are assigned to a variable. It is a little different than a standard AHK array structure but pretty close.

Here is an example of loading in data to a SafeArray and then looping through that array.

Code: Select all

xlApp := ComObjActive("Excel.Application")
LastRow := xlApp.ActiveSheet.UsedRange.Rows.Count
SafeArray_XYZ := xlApp.Range("K1:M" LastRow).Value
Loop % LastRow
{
	MsgBox % " Row: " A_Index "`tX`t" SafeArray_XYZ[A_Index, 1] ; row, column of array; X
	MsgBox % " Row: " A_Index "`tY`t" SafeArray_XYZ[A_Index, 2] ; row, column of array; Y
	MsgBox % " Row: " A_Index "`tZ`t" SafeArray_XYZ[A_Index, 3] ; row, column of array; Z
}

You can create separate SafeArrays for the columns you want or you could create one large SafeArray that gets even the columns inbetween that you don't need if memory is not an issue.

Loading the data needed all at once into memory and then looping through the array in memory should be much quicker. It is still a lot of data though and I did not study your code to see if you the checking process could be done more efficiently.

FG
I Tried! it does seem to be way faster, but it gives me error after the 1st row on EXCEL2 After looping it to EXCEL1 ("Invalid Index")
i also tried playing around to try and see if it will give me the same answers as my old code... NO LUCK, its either blank or gives me ERROR...

please help me more! Guide me senpai! :D

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

	

	
fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
InputBox, ccc,Enter Last Row!,,,180,100,880,540

xl := ComObjCreate("Excel.Application") 			
oWorkBook := xl.Workbooks.Open(fileCh)
lstrw := oWorkBook.ActiveSheet.UsedRange.Rows.Count

	
xl2 := ComObjCreate("Excel.Application") 			
oWorkBook2 := xl2.Workbooks.Open(fileDh)
lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
	
	
;xl:= ComObjActive("Excel.Application")
LastRow := xl.ActiveSheet.UsedRange.Rows.Count
SafeArray_XYZ := xl.Range("A1:M" LastRow).Value
	
;xl2:= ComObjActive("Excel.Application")
LastRow2 := xl2.ActiveSheet.UsedRange.Rows.Count
SafeArray2_XYZ := xl2.Range("A1:Z" LastRow2).Value

	Gosub, byuwer
	Goto, trytry

Return


trytry:


Loop, % LastRow
{

	ChX := SafeArray_XYZ[cc, 11]
	ChY := SafeArray_XYZ[cc, 12]
	ChZ := SafeArray_XYZ[cc, 13]
	ChID := SafeArray_XYZ[cc, 8]

	DhX := SafeArray2_XYZ[ccc, 24]
	DhY := SafeArray2_XYZ[ccc, 25]
	DhZ := SafeArray2_XYZ[ccc, 26]
	DhID := SafeArray2_XYZ[ccc, 1]
	DhCHAPA := SafeArray2_XYZ[ccc, 6]

	
qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2

qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2
	
			sagot := SQRT(qX + qY + qZ)
			;I just added this FILEAPPEND part to see all the datas being processed and see where my problem is comment it if you want
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\TestAnswers.txt
			if(sagot<=5)
{
if(sagot>0)
				{
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
				}
}


				
cc:=cc+1
GuiControl,20:,N1,%cc%
GuiControl,20:,N2,%ccc%
}
Goto, trytry2
Return


trytry2:
			if(ccc<=LastRow2)
				{

					ccc:=ccc+1
					cc:= 2
					FileAppend, `n%ccc%,%A_WorkingDir%\LastDDH.txt

						GoTo, trytry
					}
					
				oWorkbook.Close(1) 
				xl.Quit()
				oWorkbook2.Close(1) 
				xl2.Quit()
				FileAppend, Done on `n%A_ComputerName%,%A_WorkingDir%\Computer Done.txt
;Shutdown, 9
				exitapp

Return

byuwer:
	Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return


GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return
User avatar
FanaticGuru
Posts: 1907
Joined: 30 Sep 2013, 22:25

Re: Comparing 2 excel Files takes Forever to finish  Topic is solved

11 Jan 2019, 13:39

ktbjx wrote:
10 Jan 2019, 22:00
I Tried! it does seem to be way faster, but it gives me error after the 1st row on EXCEL2 After looping it to EXCEL1 ("Invalid Index")
i also tried playing around to try and see if it will give me the same answers as my old code... NO LUCK, its either blank or gives me ERROR...

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

	

	
fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
InputBox, ccc,Enter Last Row!,,,180,100,880,540

xl := ComObjCreate("Excel.Application") 			
oWorkBook := xl.Workbooks.Open(fileCh)
lstrw := oWorkBook.ActiveSheet.UsedRange.Rows.Count

	
xl2 := ComObjCreate("Excel.Application") 			
oWorkBook2 := xl2.Workbooks.Open(fileDh)
lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
	
	
;xl:= ComObjActive("Excel.Application")
LastRow := xl.ActiveSheet.UsedRange.Rows.Count
SafeArray_XYZ := xl.Range("A1:M" LastRow).Value
	
;xl2:= ComObjActive("Excel.Application")
LastRow2 := xl2.ActiveSheet.UsedRange.Rows.Count
SafeArray2_XYZ := xl2.Range("A1:Z" LastRow2).Value

	Gosub, byuwer
	Goto, trytry

Return


trytry:


Loop, % LastRow
{

	ChX := SafeArray_XYZ[cc, 11]
	ChY := SafeArray_XYZ[cc, 12]
	ChZ := SafeArray_XYZ[cc, 13]
	ChID := SafeArray_XYZ[cc, 8]

	DhX := SafeArray2_XYZ[ccc, 24]
	DhY := SafeArray2_XYZ[ccc, 25]
	DhZ := SafeArray2_XYZ[ccc, 26]
	DhID := SafeArray2_XYZ[ccc, 1]
	DhCHAPA := SafeArray2_XYZ[ccc, 6]

	
qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2

qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2
	
			sagot := SQRT(qX + qY + qZ)
			;I just added this FILEAPPEND part to see all the datas being processed and see where my problem is comment it if you want
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\TestAnswers.txt
			if(sagot<=5)
{
if(sagot>0)
				{
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
				}
}


				
cc:=cc+1
GuiControl,20:,N1,%cc%
GuiControl,20:,N2,%ccc%
}
Goto, trytry2
Return


trytry2:
			if(ccc<=LastRow2)
				{

					ccc:=ccc+1
					cc:= 2
					FileAppend, `n%ccc%,%A_WorkingDir%\LastDDH.txt

						GoTo, trytry
					}
					
				oWorkbook.Close(1) 
				xl.Quit()
				oWorkbook2.Close(1) 
				xl2.Quit()
				FileAppend, Done on `n%A_ComputerName%,%A_WorkingDir%\Computer Done.txt
;Shutdown, 9
				exitapp

Return

byuwer:
	Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return


GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return
You need to debug your code. I am only giving you the tools. You have to build the house.

If you get an error that says "Invalid Index" that probably means the Index of the array in the line it points to is not of the right type or out of range.

I assume it is on a line in this area:

Code: Select all

	ChX := SafeArray_XYZ[cc, 11]
	ChY := SafeArray_XYZ[cc, 12]
	ChZ := SafeArray_XYZ[cc, 13]
	ChID := SafeArray_XYZ[cc, 8]

	DhX := SafeArray2_XYZ[ccc, 24]
	DhY := SafeArray2_XYZ[ccc, 25]
	DhZ := SafeArray2_XYZ[ccc, 26]
	DhID := SafeArray2_XYZ[ccc, 1]
	DhCHAPA := SafeArray2_XYZ[ccc, 6]
You need to put a MsgBox % cc " --- " ccc in there somewhere and see what those variables equal and if that is what you expect it to equal. Basic debugging stuff.

Error messages have meanings and try to point you to the problem. Simply saying code doesn't work is not very useful in seeking help. Show the exact code and exact error and exact line and exact value of variables at that point, and people might be able to tell you why that line does not work. But if you gather that information there is a good chance the problem and solution will reveal itself.

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts
AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon
Hotstring Manager - Create and Manage Hotstrings
[Class] WinHook - Create Window Shell Hooks and Window Event Hooks
mast4rwang
Posts: 141
Joined: 19 Jul 2017, 09:59

Re: Comparing 2 excel Files takes Forever to finish

11 Jan 2019, 13:49

What is the goal of your app? What happens after it compares two excel files?
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Re: Comparing 2 excel Files takes Forever to finish

11 Jan 2019, 20:43

FanaticGuru wrote:
11 Jan 2019, 13:39
You need to debug your code. I am only giving you the tools. You have to build the house.

If you get an error that says "Invalid Index" that probably means the Index of the array in the line it points to is not of the right type or out of range.

I assume it is on a line in this area:

Code: Select all

	ChX := SafeArray_XYZ[cc, 11]
	ChY := SafeArray_XYZ[cc, 12]
	ChZ := SafeArray_XYZ[cc, 13]
	ChID := SafeArray_XYZ[cc, 8]

	DhX := SafeArray2_XYZ[ccc, 24]
	DhY := SafeArray2_XYZ[ccc, 25]
	DhZ := SafeArray2_XYZ[ccc, 26]
	DhID := SafeArray2_XYZ[ccc, 1]
	DhCHAPA := SafeArray2_XYZ[ccc, 6]
You need to put a MsgBox % cc " --- " ccc in there somewhere and see what those variables equal and if that is what you expect it to equal. Basic debugging stuff.

Error messages have meanings and try to point you to the problem. Simply saying code doesn't work is not very useful in seeking help. Show the exact code and exact error and exact line and exact value of variables at that point, and people might be able to tell you why that line does not work. But if you gather that information there is a good chance the problem and solution will reveal itself.

FG
Thanks Ive Fixed it! i added this If condition, thanks for the help!
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Re: Comparing 2 excel Files takes Forever to finish

11 Jan 2019, 20:57

mast4rwang wrote:
11 Jan 2019, 13:49
What is the goal of your app? What happens after it compares two excel files?
the goal sir is to compare 2 database with mid points to each other and only get those points with a distance 5 and below
Excel1 has over a million rows
Excel 2 has over 38K rows
Im using pythagorean theorem to calculate the distance between 2 points.
Now if the app sees that the distance is 5 and below, it will take all the data on that row PLUS all the data on the other Excel,
the output is text file, and to answer your last question... nothing really, after comparing the 2 dbase, it just closes.. my output file is already there...

my Problem is that it takes too long to compare each row to each and every row on the second database... that is the part i need to revise
IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 00:10

.
Last edited by IMEime on 13 Jan 2019, 15:03, edited 1 time in total.
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 00:31

IMEime wrote:
12 Jan 2019, 00:10
how's your current status.

how long it will take you to finish your goal ?
a minute ? 10 minutes ?

how's your final goal ?
a second ? 2 seconds ?

the fasted method I have ever seen is OLEDB but, that is very old now (32 bit only).
It is faster than COM more than 60 times
-one was less than a second the other was more than a minute to complete my test
Its not yet finish until now.

i tested it... i run my script to a part of the database, it is only a portion of the database so it is about 300 rows to compare on 38K rows.
on the old script, it took me 1 whole day... but now it only took me 45 minutes!...

sir if you have a better solution, please... IM ALL EARS...

Heres the New Script:

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

	

	
fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
InputBox, ccc,Enter Last Row!,,,180,100,880,540
FileAppend, Start: %A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec%,%A_WorkingDir%\Computer Done.txt

xl := ComObjCreate("Excel.Application") 			
;oWorkBook := xl.Workbooks.Open(fileCh)
;lstrw := oWorkBook.ActiveSheet.UsedRange.Rows.Count
;
;	
xl2 := ComObjCreate("Excel.Application") 			
;oWorkBook2 := xl2.Workbooks.Open(fileDh)
;lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
	
 		
;xl:= ComObjActive("Excel.Application")
oWorkBook := xl.Workbooks.Open(fileCh)
LastRow := xl.ActiveSheet.UsedRange.Rows.Count
SafeArray_XYZ := xl.Range("A1:M" LastRow).Value

;xl2:= ComObjActive("Excel.Application")
oWorkBook2 := xl2.Workbooks.Open(fileDh)
LastRow2 := xl2.ActiveSheet.UsedRange.Rows.Count
SafeArray2_XYZ := xl2.Range("A1:Z" LastRow2).Value
	
	Gosub, byuwer
	Goto, trytry

Return


trytry:
Loop, % LastRow
{

	ChX := SafeArray_XYZ[cc, 11]
	ChY := SafeArray_XYZ[cc, 12]
	ChZ := SafeArray_XYZ[cc, 13]
	ChID := SafeArray_XYZ[cc, 8]
		
	DhX := SafeArray2_XYZ[ccc , 24]
	DhY := SafeArray2_XYZ[ccc , 25]
	DhZ := SafeArray2_XYZ[ccc , 26]
	DhID := SafeArray2_XYZ[ccc , 1]
	DhCHAPA := SafeArray2_XYZ[ccc , 6]

	
qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2

qX:= (ChX-DhX)**2
qY:= (ChY-DhY)**2
qZ:= (ChZ-DhZ)**2
	
			sagot := SQRT(qX + qY + qZ)
				if(sagot<=5)
{
if(sagot>0)
				{
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
				}
}


				if(cc < LastRow)
				{
cc := cc + 1
currentCH += part
}
GuiControl,20:,N1,%cc%


}
Goto, trytry2
Return


trytry2:
			if(ccc < LastRow2)
				{
					ccc := ccc + 1
					currentDH += part2
					cc := 2
					GuiControl,20:,N2,%ccc%
		
					FileAppend, `n%ccc%,%A_WorkingDir%\LastDDH.txt

						GoTo, trytry
					}
					
				oWorkbook.Close(1) 
				xl.Quit()
				oWorkbook2.Close(1) 
				xl2.Quit()

				FileAppend, `nEnd: %A_YYYY%-%A_MM%-%A_DD% %A_Hour%:%A_Min%:%A_Sec%`n Done on %A_ComputerName%,%A_WorkingDir%\Computer Done.txt
;Shutdown, 9
				ExitApp

Return

byuwer:
	;Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return


GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return

IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 00:42

.
Last edited by IMEime on 13 Jan 2019, 15:03, edited 1 time in total.
IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 00:44

.
Last edited by IMEime on 13 Jan 2019, 15:03, edited 1 time in total.
ktbjx
Posts: 71
Joined: 11 Jul 2015, 23:53

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 00:55

IMEime wrote:
12 Jan 2019, 00:42
I posted 2 comment

One, you ignored perfectly
The other is pretty old method - but I guess, you can use as 'exe' form if you want to use (of course it has its own limitations too)..

That is all I can tell you

regards
owh yeah! i went Back and saw your post. i missed it sorry, you used Shell?? and array too... thats what my script is now, it uses array...
but i will research on that shell though... i never tried that
IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 01:02

.
Last edited by IMEime on 13 Jan 2019, 15:02, edited 1 time in total.
hd0202
Posts: 183
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 12:05

here is my version. I read the data from excel2 (38k records) into an AHK array and process it against excel1 (>1 million records):

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
;InputBox, ccc,Enter Last Row!,,,180,100,880,540

xl := ComObjCreate("Excel.Application") 			
oWorkBook := xl.Workbooks.Open(fileCh)
lstrw := oWorkBook.ActiveSheet.UsedRange.rows.count

xl2 := ComObjCreate("Excel.Application") 			
oWorkBook2 := xl2.Workbooks.Open(fileDh)
lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
tab := {}
ccc := 1
loop, % lstrw2
{
	DhX := oWorkbook2.ActiveSheet.Range("X"ccc).Value
	DhY := oWorkbook2.ActiveSheet.Range("Y"ccc).Value
	DhZ := oWorkbook2.ActiveSheet.Range("Z"ccc).Value
	DhID := oWorkbook2.ActiveSheet.Range("A"ccc).Value
	DhCHAPA := oWorkbook2.ActiveSheet.Range("F"ccc).Value
	tab.insert({DhX : DhX, DhY : Dhy, DhZ : DhZ, DhID : DhID, DhCHAPA : DhCHAPA})
	ccc++
}
ccc := 1
Gosub, byuwer

Loop, %lstrw%
{
	ChX := oWorkbook.ActiveSheet.Range("K"cc).Value
	ChY := oWorkbook.ActiveSheet.Range("L"cc).Value
	ChZ := oWorkbook.ActiveSheet.Range("M"cc).Value
	ChID := oWorkbook.ActiveSheet.Range("H"cc).Value
		
	Loop, %lstrw2%
	{
		DhX := tab[a_index, "DhX"]
		DhY := tab[a_index, "DhY"]
		DhZ := tab[a_index, "DhZ"]
		DhID := tab[a_index, "DhID"]
		DhCHAPA:= tab[a_index, "DhCHAPA"]

		qX:= (ChX-DhX)**2
		qY:= (ChY-DhY)**2
		qZ:= (ChZ-DhZ)**2
	
		sagot := SQRT(qX + qY + qZ)
			
		if(sagot<=5)
		{
			if(sagot>0)
			{
				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
			}
		}
	}
				
	cc:=cc+1
	GuiControl,20:,N1,%cc%
	GuiControl,20:,N2,%ccc%
}
oWorkbook.Close(1) 
xl.Quit()
oWorkbook2.Close(1) 
xl2.Quit()
FileAppend, Done on `n%A_ComputerName%,%A_WorkingDir%\Computer Done.txt
;Shutdown, 9
exitapp

byuwer:
	Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return

GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return
Hubert
User avatar
FanaticGuru
Posts: 1907
Joined: 30 Sep 2013, 22:25

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 15:40

If I understand your task correctly, how you load the data into memory is insignificant to the time to process the data. Whether you load the data by traditional COM or more directly through accessing the XML of the data structure, the loading of the data is not the bottleneck.

Now of course you need to load all the data and work from memory and not constantly be accessing the file. We are past that hurdle.

The time problem now is that you are comparing 38k xyz points to a million+ other xyz points to see which are within 5 of each other. The problem is that you are doing this in a simple but inefficient way. Basically you are looping and doing calculations 38,000 x 1,000,000 = 38,000,000,000 times. Doing these calculations 38 billion times is going to take a long time.

If you are serious about doing this you need to research more efficient techniques. There is plenty of information on algorithms for this type problem.

This is a fairly common thing to do with particle physics or astrophysics.

A common example would be that you have the xyz coordinates of 38,000 black holes and you have the xzy coordinates of 1,000,000 stars. Now find all black holes that are within 5 light years of a star. You need to pre-process your data in such a way that you don't have to compare every black hole to every star.

You don't have to reinvent the wheel, others have already put alot of thought into how to do this. I imagine you can get AHK code that does this in a matter of minutes.

The best approach also depends on the data. You would need a different approach if your result is 3 black holes are within 5 light years of 6 stars. Than if your result is that 37,578 black holes are within 5 light years of 987,321 stars.

FG
Hotkey Help - Help Dialog for Currently Running AHK Scripts
AHK Startup - Consolidate Multiply AHK Scripts with one Tray Icon
Hotstring Manager - Create and Manage Hotstrings
[Class] WinHook - Create Window Shell Hooks and Window Event Hooks
mast4rwang
Posts: 141
Joined: 19 Jul 2017, 09:59

Re: Comparing 2 excel Files takes Forever to finish

12 Jan 2019, 17:39

Someone suggests this for faster comparison:

Sort both lists with an efficient sorting algorithm (or ensure that the lists are "pre-sorted" by whoever/whatever created them).
Then, if the first name in both lists is the same you've found a match, otherwise discard whichever name is "earlier"; and do that until one of the lists are empty.
hd0202
Posts: 183
Joined: 04 Oct 2013, 03:07
Location: Germany near Cologne

Re: Comparing 2 excel Files takes Forever to finish

13 Jan 2019, 00:43

I found another problem that occurs with every method you try to find the appropriate records: FILEAPPEND
it opens and closes the file for every record
I have my version changed below to avoid this problem:

Code: Select all

#Persistent
#SingleInstance, Force
#NoEnv
Menu ,Tray, NoStandard
Menu,Tray, Add, Exit, GuiClose
SetKeyDelay, 30
SetBatchLines -1
ListLines Off
SetConTrolDelay, 0
SetWinDelay, 0
SetTitleMatchMode, 2
XI = %A_ScreenWidth%
YI = %A_ScreenHeight%
xtop := ((XI / 2) - 50)
xtopelev := (((XI / 2) - 50) / 2)
xtopelev2 := xtopelev/2
Ybot := YI-65
Ybot2 := YI-70
Ybot3 := YI-122
xbot := XI - 310
ytop := YI - YI
OnOffClrX := XI - 25
OnOffClrY := YI - 15

cc := 2
ccc := 0

	
fileselectfile, fileCh,,%A_ScriptDir%,Choose ChCut,(*.xls; *.xlsx)
fileselectfile, fileDh,,%A_ScriptDir%,Choose DH,(*.xls; *.xlsx)
if ERRORLEVEL
{
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
}
else
Gui +LastFound +OwnDialogs +AlwaysOnTop 
;InputBox, ccc,Enter Last Row!,,,180,100,880,540

xl := ComObjCreate("Excel.Application") 			
oWorkBook := xl.Workbooks.Open(fileCh)
lstrw := oWorkBook.ActiveSheet.UsedRange.rows.count

	

	
xl2 := ComObjCreate("Excel.Application") 			
oWorkBook2 := xl2.Workbooks.Open(fileDh)
lstrw2 := oWorkBook2.ActiveSheet.UsedRange.rows.count
tab := {}
ccc := 1
loop, % lstrw2
{
	DhX := oWorkbook2.ActiveSheet.Range("X"ccc).Value
	DhY := oWorkbook2.ActiveSheet.Range("Y"ccc).Value
	DhZ := oWorkbook2.ActiveSheet.Range("Z"ccc).Value
	DhID := oWorkbook2.ActiveSheet.Range("A"ccc).Value
	DhCHAPA := oWorkbook2.ActiveSheet.Range("F"ccc).Value
	tab.insert({DhX : DhX, DhY : Dhy, DhZ : DhZ, DhID : DhID, DhCHAPA : DhCHAPA})
	ccc++
}
ccc := 1
Gosub, byuwer

filedelete, % a_scriptdir "\found.txt"
file_found := fileopen(a_scriptdir "\found.txt", "w")
Loop, %lstrw%
{
	ChX := oWorkbook.ActiveSheet.Range("K"cc).Value
	ChY := oWorkbook.ActiveSheet.Range("L"cc).Value
	ChZ := oWorkbook.ActiveSheet.Range("M"cc).Value
	ChID := oWorkbook.ActiveSheet.Range("H"cc).Value
		
	Loop, %lstrw2%
	{
		ccc := a_index
		DhX := tab[a_index, "DhX"]
		DhY := tab[a_index, "DhY"]
		DhZ := tab[a_index, "DhZ"]
		DhID := tab[a_index, "DhID"]
		DhCHAPA:= tab[a_index, "DhCHAPA"]

		qX:= (ChX-DhX)**2
		qY:= (ChY-DhY)**2
		qZ:= (ChZ-DhZ)**2
	
		sagot := SQRT(qX + qY + qZ)
			
		if(sagot<=5)
		{
			if(sagot>0)
			{
				found_rec = %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%
				file_found.writeline(found_rec)
;				FileAppend, %ChX%%A_Tab%%ChY%%A_Tab%%ChZ%%A_Tab%%ChID%%A_Tab%<CH========DH>%A_Tab%%DhX%%A_Tab%%DhY%%A_Tab%%DhZ%%A_Tab%%DhID%%A_Tab%%DhCHAPA%%A_Tab%<=Distance=>%A_Tab%%sagot%%A_Tab%<=DDH Row=>%A_Tab%%ccc%`n,%A_WorkingDir%\Found.txt
			}
		}

	}
				
	cc:=cc+1
	GuiControl,20:,N1,%cc%
	GuiControl,20:,N2,%ccc%
}
oWorkbook.Close(1) 
xl.Quit()
oWorkbook2.Close(1) 
xl2.Quit()
file_found.close()
FileAppend, Done on `n%A_ComputerName%,%A_WorkingDir%\Computer Done.txt
;Shutdown, 9
exitapp

byuwer:
	Gui,20: Destroy
	Gui,20: -Caption +ToolWindow +OwnDialogs -AlwaysOnTop +LastFound +E0x20
stringtry=%cc%%ccc%
StringLen, haba, stringtry
haba:=(haba+60)
Gui,20: Default
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13, CHCut: 
Gui,20: Add, Text,w%haba% h13 vN1 ys,%cc%
Gui,20: Font,
Gui,20: Font, s10, Arial Rounded MT Bold
Gui,20: Add, Text,h13 ys, --  DDH: 
Gui,20: Add, Text,w%haba% h13 vN2 ys,%ccc%
Gui,20: Font, s50, Arial Rounded MT Bold
Gui,20: Add, Text,Center Xn,Please Don't Turn OFF this Computer!
Gui,20: Add, Text,Center Xn,Please Don't OPEN any EXCEL file too!
Gui,20: Font, s40, Arial Rounded MT Bold
Gui,20: Add, Text,Center,Processing Point Variance...
Gui,20: Show,
Return

GuiClose:
Process, Close, EXCEL.exe
Sleep, 50
Process, Close, EXCEL.exe
Sleep, 50
exitapp
Return
Hubert
IMEime
Posts: 750
Joined: 20 Sep 2014, 06:15

Re: Comparing 2 excel Files takes Forever to finish

13 Jan 2019, 02:29

.
Last edited by IMEime on 13 Jan 2019, 15:02, edited 1 time in total.

Return to “Ask for Help (v1)”

Who is online

Users browsing this forum: Bing [Bot], Chunjee, Gorgrak, Leonardo_Portela and 128 guests