PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : کمک برای نوشتن ماکرو



mohsen amin
2011/08/03, 22:48
سلام به دوستان عزیز و بزرگوارم
امیدوارم در هرجا که هستین موفق و پیروز باشید.
حقیقتش من از ماکرونویسی حتی یک ذره هم سر در نمیارم
ولی درخواستی داشتم که هرکدوم از دوستان عزیز زحمت بکش و در زمانی که فرصت دارن ، برام انجامش بدن،واقعا به من منت گذاشتن.
درخواستم این بود، فرض کنید در sheet 1 یک ستون اسم داریم و در مقابلش هم نمره ای،حالا یه ماکرو اینکارو انجام بده که در sheet 2 بیاد از هر اسم فقط یکیش رو بنویسه و در مقابلش هم جمع اعدادی روبروی همون اسم در شیت1 رو بگذاره
در ضمن ممکنه به شیت1 اسامی جدید با نمرات جدید هم اضافه بشه که با هربار باز کردن برنامه،اسامی جدید و جمع نمرات اونها ، در شیت2 بصورت خودکار، نمایان بشن
برای تفهیم بهتر 2تا عکس ضمیمه هست که کمک میکنه.
http://forum.p30pedia.com/attachment.php?attachmentid=1635&d=1312106432
http://forum.p30pedia.com/attachment.php?attachmentid=1634&d=1312106431

m_d6712
2011/08/07, 00:25
شما برای این کار نیاز به ماکرو ندارید دوست عزیز: با فرمول های اکسل به راحتی می توانید این کار را انجام دهید!
شما باید از تابع SUM در شیت دوم برای جمع زدن اعداد داخل شیت اول استفاده کنید.

komeilex
2011/08/08, 10:21
سلام به تو. راستش منم تو این کار زیاد حرفه ای نیستم ولی کاری رو که خواستی برات انجام دادم و امیدوارم راهنمایی من کمکت کنه.
آقا به طور کلی ماکرو در حد ابتدایی چیزی جز ضبت کردن انجام یه کار و اجرای کل اون کار با یک کلید میان بر نیست!برای این کار بعد از فعال کردن تب developer از منوی اکسل آپشن گزینه ضبت ماکرو رو از گوشه پایینی سمت چپ صفحه انتخاب می کنی و بعد از وارد کردن نام ماکرو و کلید میان بر ok می کنی. از این به بعد هر کاری کنی به عنوان ماکروی مورد نظر ذخیره میشه. برای پایان ذخیره همون دکمه پایین گوشه سمت چپ رو انتخاب کن.
واما برای سوال تو.
بعد از وارد کردن اسامی و نمرات، محدوده اسامی رو انتخاب کن و اونهارو تو شیت 2 کپی کن. از تب data گزینه remove duplicate رو انتخاب کن تا اسامی تکراری حذف بشن. بعد با ابزار considolate از همون تب data کاری که میخوای رو انجام بده. یادت باشه تو تمام این مراحل داری کارتو با ماکرو ضبت می کنی تا بعد از اتمام نیاز نداشته باشی برای داده های جدید تمام این مراحل رو انجام بدی و کلید میانبری که تعریف کردی کل کارو برات انجام بده. موفق باشی

khakzad
2011/08/08, 12:09
سلام
شما میتونید اول فیلتر کنید و در advanced filter گزینه uniqe records رو بزنید.به این ترتیب از هر مورد یکی برای شما فیلتر میشود.به این ترتیب لیست شما آماده هست.
بعد با استفاده از فرمول sumif این کار رو انجام میدید.که range و sumrange رو از لیست اولیه و criteria رو از لیست ثانویه انتخاب میکنید
فایل نمونه رو براتون گذاشتم
سوالی بود در خدمتم[hr]
در مورد سوال دوم هم همونطور که فرمودند ماکرو رو ضبط می کنید.
هم میتونید برای هربار اجرا شدن، ماکرو رو run کنید.هم اینکه کدی هست که ماکروها را در زمان های خاص بصورت خودکار و بدون نیاز به run کردن ماکرو اجرا میکنه.
اگر مایل بودبد کد رو میگم[hr]
موقع ضبط ماکرو به آدرس دهی در فرمول ها دقت کنید که بعدا در صورت افزایش تعداد رکوردها مشکلی پیش نیاد
موفق باشید

victoria_1370
2014/07/28, 11:52
سلام
من ی ماکرو نوشتم در مورد اینکه دوتا ستون رو با هم مقایسه کنه ..مثلا در اینجا A رو با G مقایسه کنه و بعد اگر مثلا اولین کد خونه G در A وجود داشت در ستون کنار G درست در مقابل همون کد که مقایسش کرد بنویسه T و اگر نبود هم بنویسهF
اما اجرا نمیشه نمیدونم چرا میشه بگین کد درسته؟اروری که میده در مورد اینه که ماکرو غیرفعاله چجوری باید فعالش کنم؟
Sub samp()
Dim i As Integer
Dim j As Integer
For i = 2 To 12952
For j = 2 To 11498
If Cells(7, i).Value = Cells(1, j).Value Then
Cells(8, i).Value = "T"
Else
Cells(8, i).Value = "f"
End If
Next j
Next i

End Sub

ali.b
2014/07/28, 12:13
ورژن افیس شما چنده؟
فایل رو باید با پسوند xlsm ذخیره کنید که با save as امکان پذیره
برای افیس 2007 باید تو تنظیمات ماکرو رو فعال کنی

victoria_1370
2014/07/28, 15:05
بله ممنونم فعالش کردم اما وقتی اجراش میکنم انگار تو لوپ میفته اصلا هیچ کاری نمیکنه میشه ی نگاهی به کدی که نوشتم بندازین؟جاییش اشتباهه؟
ممنون

K1P
2014/07/28, 15:58
سلام،
اولا" که اگر براي ستون A و G مي خواهيد عمل شود سطر و ستونها را جابجا نوشته ايد، بعدش هم شايد چون حدود 11 تا 12 هزارتا خانه مد نظرتون است هنگ مي کند! ولي فکر کنم کلا" کدنويسيتون غلط باشد.
به نظر من اصلا" دو تا متغيير نبايد تعريف کنيد (البته تا اونجا که من از توضيحاتتان درک کردم) من يک کد براي بيست رديف ستون A با يک متغيير نوشتم بينيد به درد مي خورد:

Sub Macro1()Dim i As Integer
For i = 2 To 20
If Application.WorksheetFunction.CountIf(Range("a1:a20"), Cells(i, 7).Value) > 0 Then
Cells(i, 8).Value = "T"
Else
Cells(i, 8).Value = "f"
End If
Next i
End Sub



بعد شما بايد 20 را به 11498 تغيير دهيد
البته گفتم که: اگر سوالتان را درست فهميده باشم!
من فرض را بر اين گرفته ام که هر خانه از G2 تا G12952 را مي آيد در ستون A در محدوده A2 تا A11498 مي گردد، اگر مشابه داشت T وگرنه F را در خانه بغلي مي نويسد.
يعني A2 تا A11498 ثابت است و ديگر احتياج به تعريف متغيير براي آن نيست.

Juliet
2014/07/28, 16:19
سلام
من ی ماکرو نوشتم در مورد اینکه دوتا ستون رو با هم مقایسه کنه ..مثلا در اینجا A رو با G مقایسه کنه و بعد اگر مثلا اولین کد خونه G در A وجود داشت در ستون کنار G درست در مقابل همون کد که مقایسش کرد بنویسه T و اگر نبود هم بنویسهF
اما اجرا نمیشه نمیدونم چرا میشه بگین کد درسته؟اروری که میده در مورد اینه که ماکرو غیرفعاله چجوری باید فعالش کنم؟
Sub samp()
Dim i As Integer
Dim j As Integer
For i = 2 To 12952
For j = 2 To 11498
If Cells(7, i).Value = Cells(1, j).Value Then
Cells(8, i).Value = "T"
Else
Cells(8, i).Value = "f"
End If
Next j
Next i

End Sub

درود دوست عزیز

اینطور که من متوجه شدم شما در ستونی مثلاً B مقادیری دارین که میخواهین چک کنین ببینین هر کدام از سلول های این ستون برابر با یکی از سلول های ستون دیگه مثلاً A هست یا نه. اگر این رو بخواهین یه اشتباه دارین تو کدتون
وقتی از تابع Cells استفاده میکنین، آرگومان اول شماره سطر و آرگومان دوم شماره ستون هست، درحالیکه شما شماره سطر ها رو ثابت و شماره ستون ها رو متغیر در نظر گرفتین (شمارنده حلقه)

فایل نمونه ای گه براتون گزاشتم مقادیر 10 سطر اول ستون های A و B رو قیاس میکنه، میتونین محدوده رو به هر جا که دلتون میخواد تغییر بدین، کافیه اعداد ثابت جایگزین شن. به این صورت که محدوده سطر هاتون سقف حلقه ها میشن و شماره ستون نمایش نتیجه هم جای عدد سه میاد، 2 و 1 هم ستون هایی که با هم قیاس میشن. متغیر ها رو تغییر ندین.

Private Sub cmd_Click()

Dim i, j As Integer

For i = 1 To 10
For j = 1 To 10

If Cells(i, 2).Value = Cells(j, 1).Value Then
Cells(i, 3).Value = "TRUE"
Exit For
Else
Cells(i, 3).Value = "FALSE"
End If

Next j
Next i

End Sub


به اضافه اینکه وقتی فایل xlsm یعنی فایل اکسلی که کد VBA داره رو باز میکنین، اکسل پیغامی در یک کادر زرد رنگ بهتون میده با عنوان Security Warning اون رو با دکمه Enable Content فعال کنین، ضمناً قبل از این دکمه هم فایل رو که باز میکنین ممکنه لازم باشه دکمه Enable Editing رو هم بزنین.

====================

یه موضوع دیگه، فکر میکنم بهتر بود به جای ارسال پاسخ به این تاپیک (که مال سه سال پیشه)، خودتون یک سؤال رو شروع میکردین، به نظرم برای همگون بودن با قوانین انجمن عزیز در این مورد از یکی از مدیران گرام مشورت بگیرین، به هر صورت نظر قطعی با اون هاست.

امیدوارم این کد به دردتون بخوره
موفق باشین

K1P
2014/07/28, 16:29
البته اگر مي خواهيد هر خانه با خانه متناظرش مقايسه شود (مثلا" G2 با A2 و G3 با A3 )اون موقع کدتان اينجوري مي شود:
(البته در اين صورت تو کد اولتون حداقل بايد 12952 با 11498 برابر مي بود! براي همين آدم شک مي کند که منظورتون دقيقا" چيست!)

Sub Macro1()
Dim i As Integer
For i = 2 To 20
If Cells(i, 7).Value = Cells(i, 7).Offset(0, -6).Value Then
Cells(i, 8).Value = "T"
Else
Cells(i, 8).Value = "f"
End If
Next i
End Sub

victoria_1370
2014/07/28, 20:26
سلام،
اولا" که اگر براي ستون A و G مي خواهيد عمل شود سطر و ستونها را جابجا نوشته ايد، بعدش هم شايد چون حدود 11 تا 12 هزارتا خانه مد نظرتون است هنگ مي کند! ولي فکر کنم کلا" کدنويسيتون غلط باشد.
به نظر من اصلا" دو تا متغيير نبايد تعريف کنيد (البته تا اونجا که من از توضيحاتتان درک کردم) من يک کد براي بيست رديف ستون A با يک متغيير نوشتم بينيد به درد مي خورد:

Sub Macro1()Dim i As Integer
For i = 2 To 20
If Application.WorksheetFunction.CountIf(Range("a1:a20"), Cells(i, 7).Value) > 0 Then
Cells(i, 8).Value = "T"
Else
Cells(i, 8).Value = "f"
End If
Next i
End Sub



بعد شما بايد 20 را به 11498 تغيير دهيد
البته گفتم که: اگر سوالتان را درست فهميده باشم!
من فرض را بر اين گرفته ام که هر خانه از G2 تا G12952 را مي آيد در ستون A در محدوده A2 تا A11498 مي گردد، اگر مشابه داشت T وگرنه F را در خانه بغلي مي نويسد.
يعني A2 تا A11498 ثابت است و ديگر احتياج به تعريف متغيير براي آن نيست.

واقعا لطف کردین ی دنیا ممنون
مشکل حل شد

victoria_1370
2014/07/28, 20:29
درود دوست عزیز

اینطور که من متوجه شدم شما در ستونی مثلاً B مقادیری دارین که میخواهین چک کنین ببینین هر کدام از سلول های این ستون برابر با یکی از سلول های ستون دیگه مثلاً A هست یا نه. اگر این رو بخواهین یه اشتباه دارین تو کدتون
وقتی از تابع Cells استفاده میکنین، آرگومان اول شماره سطر و آرگومان دوم شماره ستون هست، درحالیکه شما شماره سطر ها رو ثابت و شماره ستون ها رو متغیر در نظر گرفتین (شمارنده حلقه)

فایل نمونه ای گه براتون گزاشتم مقادیر 10 سطر اول ستون های A و B رو قیاس میکنه، میتونین محدوده رو به هر جا که دلتون میخواد تغییر بدین، کافیه اعداد ثابت جایگزین شن. به این صورت که محدوده سطر هاتون سقف حلقه ها میشن و شماره ستون نمایش نتیجه هم جای عدد سه میاد، 2 و 1 هم ستون هایی که با هم قیاس میشن. متغیر ها رو تغییر ندین.

Private Sub cmd_Click()

Dim i, j As Integer

For i = 1 To 10
For j = 1 To 10

If Cells(i, 2).Value = Cells(j, 1).Value Then
Cells(i, 3).Value = "TRUE"
Exit For
Else
Cells(i, 3).Value = "FALSE"
End If

Next j
Next i

End Sub


به اضافه اینکه وقتی فایل xlsm یعنی فایل اکسلی که کد VBA داره رو باز میکنین، اکسل پیغامی در یک کادر زرد رنگ بهتون میده با عنوان Security Warning اون رو با دکمه Enable Content فعال کنین، ضمناً قبل از این دکمه هم فایل رو که باز میکنین ممکنه لازم باشه دکمه Enable Editing رو هم بزنین.

====================

یه موضوع دیگه، فکر میکنم بهتر بود به جای ارسال پاسخ به این تاپیک (که مال سه سال پیشه)، خودتون یک سؤال رو شروع میکردین، به نظرم برای همگون بودن با قوانین انجمن عزیز در این مورد از یکی از مدیران گرام مشورت بگیرین، به هر صورت نظر قطعی با اون هاست.

امیدوارم این کد به دردتون بخوره
موفق باشین

از اینکه وقتتون رو در اختیارم گذاشتین ی دنیا ممنون
در مورد پیشنهاد ایجاد سوال جدید باید بگم من دفعه قبل همین کارو کردم اما متاسفانه اخطار خوردم که از پیشینه سایت استفاده کنم ...متاسفانه در این مورد من هیچی نمیدونم چون قوانین سایت برام مبهمه ...مجبور شدم از این تاپیک قدیمی استفاده کنم
بازم از لطفتون ممنون

Juliet
2014/07/30, 18:23
از اینکه وقتتون رو در اختیارم گذاشتین ی دنیا ممنون
در مورد پیشنهاد ایجاد سوال جدید باید بگم من دفعه قبل همین کارو کردم اما متاسفانه اخطار خوردم که از پیشینه سایت استفاده کنم ...متاسفانه در این مورد من هیچی نمیدونم چون قوانین سایت برام مبهمه ...مجبور شدم از این تاپیک قدیمی استفاده کنم
بازم از لطفتون ممنون

خواهش میکنم، اگر تونسته باشم در حل مشکلتون کمکی کرده باشم باعث مسرته
پیروز باشید

victoria_1370
2014/08/12, 14:43
سلام من ی ماکرو نوشتم و زمان اجرای اون خیلی طولانی شده
میخوام بدونم راهی هست که بتونم در حین اجرا اونو متوقف کنم و بتونم نتیجه رو ببینم و دوباره ران کنم تا ادامه بده؟
ممنون

khakzad
2014/08/12, 14:53
چند راه متنوع وجود داره:
1) با کلید F8 کدهای خودتون رو خط به خط اجرا کنید
2) داخل کدتون ی نقطه انفصال بذارید که فقط تا اون شرط ران کنه و ج رو داخل مسیج باکس ببینید (در این حالت نمی تونید اجرای کد رو از اون مرحله ادامه بدید)
3) وقتی نقطه انفصال م یذارید، مثلا میگید حلقه به دور دهم که رسید، msgbox بذارید. در اینجا نتیجه رو بهتون نشون میده و وقتی که مسیج باکس رو مبندید ادامه کد ران میشه.

4) با موس کنار خط کدی که می خواید تا اونجا وایسته کلیک کنید تا قرمز بشه و دایره قرمز بیاد کنارش.اینطوری می گید که کد رو از اول اجرا کن تا این خط

victoria_1370
2014/08/12, 16:17
ممنون
نه منظورم این نبود
الان کدی که نوشتم چند ساعته داره اجرا میشه واسه همین نمیدونم در کدوم مرحله هست الان نمیتونم متوقف کنم و ببینم تا الان چیکار کرده؟و بعد دوباره بگم ادامه بده؟

khakzad
2014/08/12, 16:19
خیر
الان نمیشه

victoria_1370
2014/08/12, 16:34
باشه ممنون از لطفتون
فقط الان اگه بخوام این اجرا رو متوقف کنم راه ساده تری هم هست برای اجرای سریعتر این ماکرو؟؟
من از دوتا حلقه تودرتو استفاده کردم