تغییر رنگ سلول در هنگام انتخاب
- آخرین بروزرسانی: 9 شهریور 1402
تغییر رنگ سلول در هنگام انتخاب به طور پیشفرض، هنگام انتخاب یک دسته سلول، رنگ زمینه خاکستری می شود. اگر می خواهید محدوده انتخاب شده را مشخص تر کنید، می توانید رنگ زمینه آن را با توجه به نیاز خود تغییر دهید. پس با آکادمی روح الله همراه باشید توی این آموزش رایگان اکسل به صورت کامل آموزش میدهیم که چطوری بتوانید تغییر رنگ سلول های انتخاب شده را تغییر بدهید
با چند روش عالی.
بیایید کد را بهتفصیل بررسی کنیم
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
: این خط به معنای شروع تابع رویدادی است که در هنگام تغییر انتخاب کاربر در ورکشیت اجرا میشود. ورکشیت مورد نظر باعث ایجاد این رویداد میشود.With Target
: این دستورات درون یک بلوکWith
اجرا میشوند که از تمامی عملیات بعدی بر روی متغیرTarget
(که نمایانگر محدودهای از سلولها است که توسط کاربر انتخاب شده است) استفاده میکند. این روش به ویژه در مواردی که چندین دستور باید روی یک شیء انجام شود، مفید است و کد را خواناتر میکند..Worksheet.Cells.FormatConditions.Delete
: این دستور تمام شرایط قالببندی (قواعد قالببندی) را از سلولهای ورکشیت حذف میکند. به این ترتیب، هر قاعدهای که قبلاً تعریف شده باشد، حذف میشود..FormatConditions.Add xlExpression, , "TRUE"
: با این دستور، یک شرط قالببندی جدید با نوعxlExpression
(یعنی بر اساس یک عبارت منطقی) به سلولها اضافه میشود. عبارت منطقی در اینجا “TRUE” است، به این معنی که این شرط در همه موارد برقرار است و تمام سلولها تحت تأثیر قرار میگیرند..FormatConditions(1).Interior.Color = vbYellow
: در این خط، رنگ زمینه داخلی (Interior) سلولها تغییر داده میشود و به زرد تنظیم میشود..FormatConditions(1)
به اولین شرط قالببندی اشاره دارد که در اینجا تنها یک شرط وجود دارد.
پس از اجرای این کد، هر بار که کاربر یک سلول را انتخاب کند، تمام سلولها در ورکشیت با پسزمینه زرد رنگ نمایش داده میشوند. این کد به عنوان یک نمونه ساده از استفاده از قواعد قالببندی در VBA اکسل است.
تغییر رنگ سلول در هنگام انتخاب
نمونه کد تغییر رنگ سلول در هنگام انتخاب رنگ زرد
1 2 3 4 5 6 7 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target .Worksheet.Cells.FormatConditions.Delete .FormatConditions.Add xlExpression, , "TRUE" .FormatConditions(1).Interior.Color = vbYellow End With End Sub |
تغییر رنگ سلول هنگام کلیک با کد vba
این نمونه کد برای تغییر رنگ سلول هنگام کلیک به رنگ آبی آسمانی می باشید
برای تغییر رنگ قالببندی سلولها به روش دلخواه، میتوانید از کدهای VBA زیر استفاده کنید. در اینجا مثالی از تغییر رنگ زمینه به رنگ آبی آسمانی آورده شده است
1 2 3 4 5 6 7 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target .Worksheet.Cells.FormatConditions.Delete .FormatConditions.Add xlExpression, , "TRUE" .FormatConditions(1).Interior.Color = RGB(, , 255) ' رنگ آبی آسمانی End With End Sub |
تغيير رنگ سلول انتخاب شده در اکسل
برای تغيير رنگ سلول انتخاب شده در اکسل به رنگ آبی از نمونه کد زیر استفاده کنید
در این مثال، ما از تابع RGB
استفاده کردهایم تا رنگ مورد نظرمان را با استفاده از مقادیر قرمز (Red)، سبز (Green) و آبی (Blue) تعیین کنیم. با تغییر مقادیر این سه عدد، میتوانید رنگ مورد نظر خود را تعیین کنید.
همچنین، به جای استفاده از RGB
، میتوانید از کدهای رنگ از فهرست پیشفرض VBA استفاده کنید. به عنوان مثال
1 2 3 4 5 6 7 |
Private Sub Worksheet_SelectionChange(ByVal Target As Range) With Target .Worksheet.Cells.FormatConditions.Delete .FormatConditions.Add xlExpression, , "TRUE" .FormatConditions(1).Interior.Color = vbBlue ' رنگ آبی End With End Sub |
در اینجا vbBlue
به عنوان کد رنگ آبی در VBA اکسل استفاده شده است. شما میتوانید از کدهای دیگر موجود در VBA برای انتخاب رنگهای مختلف استفاده کنید.
البته در نظر داشته باشید که یک آموزش کامل نحوه استفاده از رنگ های vba در اکسل توی سایت موجود است می توانید مشاهده فرمایید.
و رنگ دلخواه خود را به سلول های اکسل بدهید برای این منظور آموزش زیر را مشاهده فرمایید.
درود بر شما
یک مشکل دیگر هم که باهاش برخورد کردم اینه که در این فایل دیگه امکان UNDO وجود نداره حتی برای ساده ترین کارها مثل تایپ در یک سلول و …
ممنون میشم راهنمایی بفرمایید.
سپاس
درود بر شما دوست گرامی،
مشکل عدم امکان Undoدر فایل اکسل شما به دلیل استفاده از رویداد Worksheet_SelectionChange ایجاد شده است. زمانی که در VBA از رویدادهای مرتبط با تغییرات در شیت (مثل
SelectionChange
,Change
و …) استفاده میکنید، Excel بهطور پیشفرض سابقه تغییرات را پاک میکند، زیرا این رویدادها دستکاریهایی انجام میدهند که Excel نمیتواند آنها را به تاریخچه تغییرات اضافه کند.راهحلها برای بازگرداندن Undo
1. جلوگیری از استفاده غیرضروری از رویداد SelectionChange:
اگر این رویداد ضروری نیست، میتوانید آن را غیرفعال کنید یا بهجای آن از روشهای جایگزین استفاده کنید.
2. حذف دستورات تغییر فرمت:
اگر تغییراتی که در این رویداد اعمال میکنید فقط مربوط به ظاهر است (مثل تغییر رنگ)، بهتر است از روشهایی استفاده کنید که نیاز به پاک کردن تاریخچه تغییرات نداشته باشند.
3. ذخیره وضعیت قبل از اعمال تغییرات:
اگر نیاز به این رویداد ضروری است، میتوانید با کدنویسی اضافی، برخی از قابلیتهای Undo را شبیهسازی کنید.
4. استفاده از کدنویسی جایگزین:
بهجای استفاده از SelectionChange، میتوانید از ماکروهایی استفاده کنید که فقط با یک کلید میانبر یا دکمه کاربرگ فعال شوند.
—
نمونه کدی برای شبیهسازی Undo:
میتوانید با ذخیره دادهها قبل از اعمال تغییرات، Undo را برای مقادیر سلولها شبیهسازی کنید:
Dim previousValue As Variant
Dim previousAddress As String
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' ذخیره مقدار سلول قبل از تغییر
If Not Target Is Nothing Then
previousValue = Target.Value
previousAddress = Target.Address
End If
' کدهای فرمتدهی شما
Application.EnableEvents = False
If Not Intersect(Target, Me.UsedRange) Is Nothing Then
Target.FormatConditions.Delete
Target.FormatConditions.Add xlExpression, , "TRUE"
Target.FormatConditions(1).Interior.Color = vbYellow
End If
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
' برای Undo، مقدار قبلی بازگردانده میشود
If Not Intersect(Target, Me.Range(previousAddress)) Is Nothing Then
If MsgBox("Do you want to undo the change?", vbYesNo) = vbYes Then
Application.EnableEvents = False
Target.Value = previousValue
Application.EnableEvents = True
End If
End If
End Sub
نکات:
1. این کد فقط برای یک سلول مقدار قبلی را ذخیره میکند. برای محدودههای بزرگتر، نیاز به تغییراتی در کد دارید.
2. ممکن است نیاز به بررسی کارایی باشد، زیرا استفاده از رویدادهای متعدد میتواند عملکرد فایل را کاهش دهد.
اگر این راهکار کافی نبود، لطفاً توضیحات بیشتری بدهید تا بتوانیم بهترین راهحل را پیدا کنیم. 🙏
پایدار پیروز باشید همیشه
درود و عرض ادب
بسیار عالی و کاربردی
ممنون از شما
درود و ادب خدمت شما
خوشحالم که این آموزش هم برایتان کاربردی بوده است. اگر باز هم سوالی داشتید یا نکتهای نیاز به توضیح بیشتر داشت، حتما بفرمایید. موفق و سربلند باشید! 😊🌟
درود بر شما
من این کدنویسی در VBA رو در یکی از فایل های اکسل اجرا کردم. مشکلی که بهش برخوردم این بود که زمانی که این آپشن رو برای فایل قرار دادم، کاندیشنال فرمتینگ مقادیر تکراری (که به رنگ قرمز در می آمدند) روی فایل مربوطه کار نمی کند.
چطور میشه این اشکال را بر طرف کرد؟
ممنون
سلام ارادت خدمت شما
مشکلی که در کد شما وجود دارد این است که در هر بار انتخاب سلول جدید در شیت، تمام فرمتهای شرطی موجود روی شیت پاک میشوند و فقط فرمت شرطی جدیدی که در کد تعریف کردهاید (رنگ زرد) اعمال میشود. به همین دلیل، فرمت شرطی مربوط به مقادیر تکراری از بین میرود.
راهحل پیشنهادی:
به جای حذف کامل تمام فرمتهای شرطی در شیت، تنها شرطی که لازم دارید را به محدوده هدف اضافه کنید، بدون اینکه فرمتهای شرطی دیگر حذف شوند.
کد اصلاحشده به این صورت است:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim fc As FormatCondition
Dim hasCondition As Boolean
Application.EnableEvents = False ' جلوگیری از اجرای مجدد رویداد
' بررسی اینکه آیا شرطی مشابه از قبل وجود دارد یا نه
For Each fc In Target.FormatConditions
If fc.Type = xlExpression And fc.Formula1 = "TRUE" Then
hasCondition = True
Exit For
End If
Next fc
' اگر شرط مشابهی وجود ندارد، اضافه کردن آن
If Not hasCondition Then
Target.FormatConditions.Add xlExpression, , "TRUE"
Target.FormatConditions(Target.FormatConditions.Count).Interior.Color = vbYellow
End If
Application.EnableEvents = True ' فعال کردن مجدد رویدادها
End Sub
توضیحات:
1. حذف نکردن فرمتهای شرطی دیگر:این کد فرمتهای شرطی قبلی را حفظ میکند و فقط در صورتی که فرمت شرطی مربوط به انتخاب سلول وجود نداشته باشد، آن را اضافه میکند.
2. بهبود عملکرد: استفاده از متغیر
hasCondition
برای بررسی وجود شرطی مشابه باعث میشود که کد اضافهکاری نکند.3. پیشگیری از بازگشتی بودن رویداد با غیرفعال کردن
Application.EnableEvents
از بازگشت مجدد به رویداد جلوگیری میشود.این راهحل کمک میکند تا کاندیشنال فرمتینگ برای مقادیر تکراری (رنگ قرمز) بدون مشکل کار کند.
شاد سلامت باشید
درود و عرض ادب
ضمن سپاس از زمانی که می گذاریدف من کد جدید را استفاده کردم ولی به دو اشکال برخورد کردم:
1. زمانی که سلول هایی را انتخاب می کنم که کاندیشنال فرمتینگ در آن ها وجود ندارد، رنگ سلول تغییر می کند ولی پس از انتخاب سلول دیگر، رنگ سلول به حالت قبل بر نمی گردد و در نتیجه تمام سلول های انتخاب شده پشت سر هم مثلا زرد رنگ می شوند.
2. با انتخاب اولین سلول از سلول هایی که کاندیشنال فرمتینگ برای آن ها تعریف شده به طور کلی کد از کار می افتد و حتی با بستن و باز کردن مجدد هم دیگر کار نمی کند و هیچ سلول انتخاب شده ی دیگری را رنگی نمی کند.
سپاس
درود بر شما دوست عزیز،
این مشکلات به دلیل ترکیب استفاده از رویدادهای
SelectionChange
وChange
و مدیریت ضعیف وضعیت سلولهای انتخابشده قبلی رخ داده است. برای رفع این اشکالات، کدی جامعتر و بهینهتر ارائه میکنم که این مسائل را مدیریت کند:کد بهینهشده:
Dim PreviousCell As Range ' برای ذخیره سلول قبلی
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error Resume Next
Application.EnableEvents = False
' بازگرداندن رنگ سلول قبلی به حالت اصلی
If Not PreviousCell Is Nothing Then
If PreviousCell.FormatConditions.Count = 0 Then ' اگر شرطی وجود ندارد
PreviousCell.Interior.ColorIndex = xlNone ' حذف رنگ پسزمینه
End If
End If
' اعمال رنگ زرد به سلول انتخابشده فعلی
If Target.FormatConditions.Count = 0 Then ' اگر فرمت شرطی وجود ندارد
Target.Interior.Color = vbYellow ' رنگ زرد اعمال شود
End If
' ذخیره سلول فعلی به عنوان سلول قبلی برای استفاده در مرحله بعدی
Set PreviousCell = Target
Application.EnableEvents = True
On Error GoTo 0
End Sub
توضیحات:
1.ازگرداندن رنگ قبلی سلول
با استفاده از متغیر
PreviousCell
، سلولی که قبلاً انتخاب شده بود شناسایی میشود و رنگ آن به حالت اولیه (بدون رنگ) بازگردانده میشود.2.عدم تداخل با Conditional Formatting
با بررسی تعداد فرمتهای شرطی یک سلول (
FormatConditions.Count
)، اطمینان حاصل میشود که تغییر رنگ به سلولهایی که دارای فرمت شرطی هستند اعمال نشود.3. مدیریت خطاها
دستور
On Error Resume Next
وOn Error GoTo 0
تضمین میکنند که در صورت رخ دادن خطا (مثلاً انتخاب سلولهای غیرمجاز)، کد متوقف نشود.رفع اشکالات شما:
1. سلولهای بدون فرمت شرطی زرد میشوند و باقی میمانند:
در کد جدید، وقتی سلول جدیدی انتخاب شود، رنگ سلول قبلی حذف خواهد شد.
2. از کار افتادن کد:
این مشکل به دلیل عدم مدیریت صحیح خطاها بود که اکنون برطرف شده است.
نکات نهایی:
– این کد فقط رنگ سلولهایی را تغییر میدهد که فرمت شرطی ندارند. سلولهایی با فرمت شرطی دستنخورده باقی میمانند.
– اگر همچنان با مسئلهای مواجه شدید، لطفاً جزئیات بیشتری بدهید تا بتوانم بهتر کمک کنم. 🙏
سلام ممنونم بابت آموزش عالیتون.
فقط ذخیر نمیشه اگه ممکن نحوه ذخیرشم بزارین که هر بار فرمول راکپی نکنیم .باتشکر
سلام ارادت خدمت شما دوست عزیز
خوشحال هستم برای شما هم مفید بود برای این منظور وارد لینک زیر شوید
نحوه ذخیره فایل اکسل حاوی ماکرو
موفق باشید مثل همیشه
سلام مجدد.
عالی بود ذخیره شد ممنون بابت راهنمایتون.
درود خدمت شما دوست عزیز
خوشحال هستم که مشکل برطرف شده بابت ارسال نظر تون بد از نتیجه سپاسگزارم موفق باشید