ايران ويج

نسخه‌ی کامل: افزایش سرعت دسترسی به اکسل با وی بی
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام
برنامه ضمیمه رو ببینید
آیا می شه سرعت دست رسی به اکسل رو بیشتر کرد چون با این کد ها مکافاتیه تا یک کاربر بخواد یک اکسپورت به اکسل داشته باشه
کد ها رو نگاه کنید باید چه چیزه دیگه ای اضافه بشه تا سرعت از این بالا تر بره؟
من تست کردم خیلی کنده .
شاید بهتر باشه اول اطلاعات رو بریزی تو یه فایل بعد به اکسل بگی بازش کنه.
سلام
از شما متشکرم آقا اشکان که لااقل برنامه رو دیدید. اون روشی که معرفی کردید سرعت رو بالا می بره ممنون اما من بیشتر روی کد ها کار کردم و نتایج قابل قبولی گرفتم.

یادم اومد قبلا آقا حامد ارفعی با آی دی Hamed_Arfaee به من لطف داشتند و در VBA فرمانی رو معرفی کردند که باعث افزایش سرعت نوشتن اطلاعات می شد. درواقع با False کردن مقدار خصوصیت ScreenUpdating میشه باعث این شد که Excel وقتی رو برای به روز کردن اطلاعات نمایشی صرف نکنه و بعدا که ما همه اطلاعات رو نوشتیم با یک بار True کردن ScreenUpdating باعث می شیم که Excel به جای مثلا 2000 بار (این در کد نمونه اتفاق می افتاد) فقط یک بار اقدام به نوسازی محتویات صفحه نمایش کنه.
از طرفی پیش خودم فکر کردم با وجود False بودن Visible پنجره Excel حتی False بودن ScreenUpdating کارساز نباشه برای همین امتحان کردم کد زیر رو اضافه کردم:
.Application.ScreenUpdating = False
و در پایان نوشتن اطلاعات در سلول های اکسل کد زیر رو آوردم:
.Application.ScreenUpdating = True

بدون این دو خط در برنامه قبلی زمان روی سیستم من 57 ثانیه بود (کپشن فرم اصلی زمان رو نشون می ده در پایان عملیات)
اما با False و True کردن به موقع خصوصیت ScreenUpdating زمان به 47 ثانیه کاهش پیدا کرد که این خودش بسی جای شکر داره.
تا یادم نرفته این رو هم بگم که روشی که در بالا معرفی شد در صورتی که پنجره Excel در حالت مشاهده (Visible=True) باشه سرعت رو تا 10 برابر هم بیشتر می کنه!!!

اما برای کاری که من می خوام انجام بدم حتی زمان 47 ثانیه هم خیلی زیاده.

بعدا یاد یه قضیه ای افتادم:
برای اینکه یک مجموعه سلول رو از Excel دریافت کنیم Excel اون مجموعه رو در آرایه ماتریکس مانندی به Vb تحویل می ده.
این شد که با خودم گفتم حتما عکسش هم ممکنه!
یعنی ما به جای اینکه بیایم تک تک سلول ها رو مقدار دهی کنیم. بیاییم و یک آرایه مربعی تشکیل بدیم و با مقدار دهی اون آرایه بعدا و فقط با یک خط کد بتونیم یک جا اطلاعات رو به Excel وارد کنیم.
این کار رو کردم و به نتیجه رسیدم.

زمان روش جدید نه دهم ثانیست Cool Happy
یعنی 63 برابر بیشتر از روش های قبلی Clap
کد ضمیمه همون برنامه قبلی با این تفاوت که کار اون رو به جای 57 ثانیه در نه دهم ثانیه انجام میده.

البته کار های دیگه ای هم کردم:
مثلا باز به جای اینکه بیام و تک تک سلول ها رو تغییر اندازه فونت بدم اومدم و همه یک مجموعه رو یکجا تغییر اندازه فونت دادم باید کد روببینید.
واقعا عالی بود
ارزش یه تشکر درست و حسابی رو داره
سلام
می شه بگید این برنامه ضمیمه کجاست؟ من شدیدا به روشش نیاز دارم. یا اگه ممکنه راهنمایی کنید.
سلام در تاپیک زیر میتونید دانلودش کنید
http://forum.iranled.com/showthread.php?tid=6250
(۱۴-مرداد-۱۳۸۸, ۰۹:۵۸:۲۳)MT888 نوشته است: [ -> ]سلام در تاپیک زیر میتونید دانلودش کنید
http://forum.iranled.com/showthread.php?tid=6250

سلام
من اون تاپیک را دیدم، ولی اون کدها تغییراتی را که اینجا در موردش صحبت شده را نداره!
سلام منم از این دو خط کد استفاده کردم ولی زمان تغییر نکرد فکر میکنم این کدهارو جای درستی نزاشتم واسه همین تغییری ندیدم
(۱۹-آبان-۱۳۸۵, ۰۲:۱۶:۱۷)Darg نوشته است: [ -> ]کد ضمیمه همون برنامه قبلی با این تفاوت که کار اون رو به جای 57 ثانیه در نه دهم ثانیه انجام میده.

با تشکر از شما فقط اگر میشه کد اصلاح شده نهایی را با همان ماتریس بذارید.
ممنون می شم.
یا حداقل بگید برای کپی کردن تمام اون ماتریس به اکسل از کدام دستور استفاده کردید؟
این کد رو نوشتم زمان رو بسیار سریعتر می کنه
آیا منظور شما هم همین کد هست یا خیر؟
کد جدید
نقل قول: با تشکر از شما فقط اگر میشه کد اصلاح شده نهایی را با همان ماتریس بذارید.
متاسفانه این تاپیک برای خیلی وقت پیشه و من اون کد قبلی رو دیگه ندارم

اما روی همین کدی که خودتون گذاشتید توضیح می دم
ببینید منظر این هست که شما به جای اینکه بیاید سلول ها رو یکی یکی مقدار دهی کنید (نمونش تو کد شما 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 ثانیه زمان اجراش بود در کمتر از یک ثانیه اجرا شد!
امید وارم مفهموم بوده باشه
(۱۹-مرداد-۱۳۸۸, ۲۳:۲۱:۴۱)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 ثانیه زمان اجراش بود در کمتر از یک ثانیه اجرا شد!
امید وارم مفهموم بوده باشه


با تشکر از شما
ممکنه توضیح بدید اگه اطلاعات یک جدول بخواهیم بریزیم داخل EXCEL باید چه کار کرد؟ که همین سرعت هم حفظ شود؟

ممنون می شم اگه راهنمایی بفرمایید
صفحه‌ها: 1 2