(۱۹-مرداد-۱۳۸۸, ۲۳:۲۱:۴۱)Darg نوشته است: [ -> ]نقل قول: با تشکر از شما فقط اگر میشه کد اصلاح شده نهایی را با همان ماتریس بذارید.
متاسفانه این تاپیک برای خیلی وقت پیشه و من اون کد قبلی رو دیگه ندارم
اما روی همین کدی که خودتون گذاشتید توضیح می دم
ببینید منظر این هست که شما به جای اینکه بیاید سلول ها رو یکی یکی مقدار دهی کنید (نمونش تو کد شما 3*5 هزار بار این اتفاق می افتاد) بیاید و یک آرایه بسازید اون آرایه رو مقدار دهی کنید و بعد یک باره آرایه رو به اکسل بدید.
این کد:
کد:
Dim aaa(1 To 5000, 1 To 3) As String
Me.Caption = Second(Now)
Dim i As Integer
Dim mApplication As New Excel.Application
Dim mWorkbook As New Excel.Workbook
Set mWorkbook = mApplication.Workbooks.Add
Dim mWorksheet As New Excel.Worksheet
Set mWorksheet = mWorkbook.Sheets.Add
mWorksheet.Name = "Test Sheet"
mApplication.Visible = False
Application.ScreenUpdating = False
For i = 1 To 5000
'With mWorksheet.Cells
' .Cells(1, i) = 10
' .Cells(2, i) = 22
' .Cells(3, i) = .Cells(1, i) + .Cells(2, i)
'End With
aaa(i, 1) = 10
aaa(i, 2) = 22
aaa(i, 3) = aaa(i, 1) + aaa(i, 2)
Next
'For i = 1 To 5000
' With mWorksheet.Cells
' .Cells(i, 1) = aaa(i, 1)
' .Cells(i, 2) = aaa(i, 2)
' .Cells(i, 3) = aaa(i, 1) + aaa(i, 2)
' End With
'Next
mWorksheet.Range("A1:C5000") = aaa
Application.ScreenUpdating = True
mApplication.Visible = True
Me.Caption = Me.Caption & " " & Second(Now)
تو این کد اگر دقت کنید ابتدا من ارایه شما رو اصلاح کردم که در تحویل اون به اکسل اطلاعات به هم نریزند بعد اون یک خطی که اضافه کردم کار رو تموم کرد:
کد:
mWorksheet.Range("A1:C5000") = aaa
به این ترتیب کد شما که روی سیستم من 11 ثانیه زمان اجراش بود در کمتر از یک ثانیه اجرا شد!
امید وارم مفهموم بوده باشه
از اصلاح کد متشکرم
سوالی دارم: اگر آرایه از 0 شروع شود مانند: dim aaa(10,20) as string
باید به شکل زیر تغییر انجام شود:
کد:
mWorksheet.Range("A1:C20") = aaa
و یا اینکه باید به روش دیگری انجام دهیم؟
ممنون
(۲۱-مرداد-۱۳۸۸, ۱۳:۴۰:۵۳)gmsara نوشته است: [ -> ]ممکنه توضیح بدید اگه اطلاعات یک جدول بخواهیم بریزیم داخل EXCEL باید چه کار کرد؟ که همین سرعت هم حفظ شود؟
مظورتون از جدول چیه؟! نمی دونم شاید منظورتون جدول دیتابیس هست!
اما این روش یه روش کلی هست برای افزایش سرعت, به این ترتیب که در اون محلی که سرعت کند می شه کار رو یه سره می کنیم.
اون زمان وقتی هست که وی بی می خواد ارتباطی با اکسل برقرار کنه. خوب.
توی این روش ما اومدیم اول تکلیف همه اطاعاتمون رو روشن کردیم (درون یک آرایه ماتریکسی) بعد اون رو فقط یک بار (یک بار برقراری همون ارتباط زمان گیر) به اکسل ارسال می کنیم.
این خیلی مفهموم هست
یا به عنوان نمونه شما می خواید 100 تا سلول رو تغییر رنگ بدید. به جای اینکه بیاید داخل یه چرخه 100 بار با اکسل ارتباط برقرار کنید و 100 بار فرمان تغییر رنگ رو بدید میاید و مثلا با فراخوان Range("A1:A100") کار رو در یک فرمان تموم می کنید و به این ترتیب سرعت تقریبا 100 برابر بیشتر می شه.
نقل قول: ...اگر آرایه از 0 شروع شود...
مشخصه که اکسل تمام ارایه ای که بهش تحویل می دید رو به عنوان خانه های سلول در نظر می گیره.
خوب اگر یه آرایه تشکیل بدید که از 0 تا 10 بیش باشه مشخصا اکسل هم ایندکس های یک تا 11 رو برای این آرایه در نظر می گیره. این کاملا در اختیار شماست.
اونجا که آرایه خودمون رو به شکل 1 تا 10 تعریف می کنیم در واقع کار مقدار دهی خودمون رو راحت می کنیم.
نکته اصلی که ما باید خودمون رو باهاش سازگار کنیم این هست که ایندکس های اکسل از یک شروع می شه نه از صفر.
آره چون وقتی آرایه من از صفر شروع میشه و مقدار دهی در ماتریکس انجام می دم مشکلی نیست ولی وقتی به اکسل متصلش می کنم میاد و ستون اول را کلا خالی می کنه و از ستون دوم مقداردهی می کنه.
پس با تغییر ایندکس اعداد مشکل حل می شه؟
(۲۱-مرداد-۱۳۸۸, ۱۶:۲۹:۴۲)Darg نوشته است: [ -> ] (۲۱-مرداد-۱۳۸۸, ۱۳:۴۰:۵۳)gmsara نوشته است: [ -> ]ممکنه توضیح بدید اگه اطلاعات یک جدول بخواهیم بریزیم داخل EXCEL باید چه کار کرد؟ که همین سرعت هم حفظ شود؟
مظورتون از جدول چیه؟! نمی دونم شاید منظورتون جدول دیتابیس هست!
بله منظورم یک TABLE از یک DATABASE هست! من اگه یک TABLE با 30 فیلد و 16000 رکورد چطور توی یک ماتریکس بریزم؟! تک تک فیلد ها را باید اسم ببرم!!!
فکر کنم یکی از راه حل هات اینه که یک بار این 30 فیلد را بنویسی بعد ازش استفاده کنی.
(۲۷-مرداد-۱۳۸۸, ۰۹:۵۴:۳۵)relax_cp نوشته است: [ -> ]فکر کنم یکی از راه حل هات اینه که یک بار این 30 فیلد را بنویسی بعد ازش استفاده کنی.
بله، ولی من دنبال راه حل منطقی هستم. فکر این هم کنید ممکنه این 30 تا بشه 60 تا فیلد