فروشگاه
انبارداری پیشرفته تحت اکسل

تغییر رنگ سلول در هنگام انتخاب

تغییر رنگ سلول در هنگام انتخاب به طور پیشفرض، هنگام انتخاب یک دسته سلول، رنگ زمینه خاکستری می شود. اگر می خواهید محدوده انتخاب شده را مشخص تر کنید، می توانید رنگ زمینه آن را با توجه به نیاز خود تغییر دهید. پس با آکادمی روح الله همراه باشید توی این آموزش رایگان اکسل به صورت کامل آموزش میدهیم که چطوری بتوانید تغییر رنگ سلول های انتخاب شده را تغییر بدهید
با چند روش عالی.

بیایید کد را به‌تفصیل بررسی کنیم

  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range): این خط به معنای شروع تابع رویدادی است که در هنگام تغییر انتخاب کاربر در ورکشیت اجرا می‌شود. ورکشیت مورد نظر باعث ایجاد این رویداد می‌شود.
  2. With Target: این دستورات درون یک بلوک With اجرا می‌شوند که از تمامی عملیات بعدی بر روی متغیر Target (که نمایانگر محدوده‌ای از سلول‌ها است که توسط کاربر انتخاب شده است) استفاده می‌کند. این روش به ویژه در مواردی که چندین دستور باید روی یک شیء انجام شود، مفید است و کد را خواناتر می‌کند.
  3. .Worksheet.Cells.FormatConditions.Delete: این دستور تمام شرایط قالب‌بندی (قواعد قالب‌بندی) را از سلول‌های ورکشیت حذف می‌کند. به این ترتیب، هر قاعده‌ای که قبلاً تعریف شده باشد، حذف می‌شود.
  4. .FormatConditions.Add xlExpression, , "TRUE": با این دستور، یک شرط قالب‌بندی جدید با نوع xlExpression (یعنی بر اساس یک عبارت منطقی) به سلول‌ها اضافه می‌شود. عبارت منطقی در اینجا “TRUE” است، به این معنی که این شرط در همه موارد برقرار است و تمام سلول‌ها تحت تأثیر قرار می‌گیرند.
  5. .FormatConditions(1).Interior.Color = vbYellow: در این خط، رنگ زمینه داخلی (Interior) سلول‌ها تغییر داده می‌شود و به زرد تنظیم می‌شود. .FormatConditions(1) به اولین شرط قالب‌بندی اشاره دارد که در اینجا تنها یک شرط وجود دارد.
پیش نهاد آکادمی روح الله برای شما :
نحوه ورود به محیط vba اکسل با 3 روش

پس از اجرای این کد، هر بار که کاربر یک سلول را انتخاب کند، تمام سلول‌ها در ورکشیت با پس‌زمینه زرد رنگ نمایش داده می‌شوند. این کد به عنوان یک نمونه ساده از استفاده از قواعد قالب‌بندی در VBA اکسل است.

تغییر رنگ سلول در هنگام انتخاب

نمونه کد تغییر رنگ سلول در هنگام انتخاب رنگ زرد

تغییر رنگ سلول هنگام کلیک با کد vba 

این نمونه کد برای تغییر رنگ سلول هنگام کلیک به رنگ آبی آسمانی می باشید

برای تغییر رنگ قالب‌بندی سلول‌ها به روش دلخواه، می‌توانید از کدهای VBA زیر استفاده کنید. در اینجا مثالی از تغییر رنگ زمینه به رنگ آبی آسمانی آورده شده است

تغيير رنگ سلول انتخاب شده در اکسل

برای تغيير رنگ سلول انتخاب شده در اکسل به رنگ آبی از نمونه کد زیر استفاده کنید

پیش نهاد آکادمی روح الله برای شما :
حل مشکل نوشتن متن فارسی در vba اکسل با 2 روش تضمینی

در این مثال، ما از تابع RGB استفاده کرده‌ایم تا رنگ مورد نظرمان را با استفاده از مقادیر قرمز (Red)، سبز (Green) و آبی (Blue) تعیین کنیم. با تغییر مقادیر این سه عدد، می‌توانید رنگ مورد نظر خود را تعیین کنید.

همچنین، به جای استفاده از RGB، می‌توانید از کدهای رنگ از فهرست پیش‌فرض VBA استفاده کنید. به عنوان مثال

در اینجا vbBlue به عنوان کد رنگ آبی در VBA اکسل استفاده شده است. شما می‌توانید از کدهای دیگر موجود در VBA برای انتخاب رنگ‌های مختلف استفاده کنید.

البته در نظر داشته باشید که یک آموزش کامل نحوه استفاده از رنگ های vba در اکسل توی سایت موجود است می توانید مشاهده فرمایید.
و رنگ دلخواه خود را به سلول های اکسل بدهید برای این منظور آموزش زیر را مشاهده فرمایید.

کار با رنگ ها در اکسل با استفاده از کدهای VBA

میانگین رتبه 5/5 تعداد رای : 2
اکسل را حرفه ای یاد بگیر
نظر شما در مورد این مقاله چیست؟

نظر یا سوال شما در این مورد چیست؟

سلام دوست عزیز خوشحال میشوم نظر شما را در مورد این مقاله بدانم 👇

    ایمان نصر

    درود بر شما
    یک مشکل دیگر هم که باهاش برخورد کردم اینه که در این فایل دیگه امکان 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. از کار افتادن کد:
            این مشکل به دلیل عدم مدیریت صحیح خطاها بود که اکنون برطرف شده است.
            نکات نهایی:
            – این کد فقط رنگ سلول‌هایی را تغییر می‌دهد که فرمت شرطی ندارند. سلول‌هایی با فرمت شرطی دست‌نخورده باقی می‌مانند.
            – اگر همچنان با مسئله‌ای مواجه شدید، لطفاً جزئیات بیشتری بدهید تا بتوانم بهتر کمک کنم. 🙏

    akbar

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

    پاسخ

      سلام ارادت خدمت شما دوست عزیز
      خوشحال هستم برای شما هم مفید بود برای این منظور وارد لینک زیر شوید
      نحوه ذخیره فایل اکسل حاوی ماکرو
      موفق باشید مثل همیشه

      پاسخ
        akbar

        سلام مجدد.
        عالی بود ذخیره شد ممنون بابت راهنمایتون.

        پاسخ

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

          پاسخ