วิธีใช้ Excel 2010 VBA เพื่อตั้งค่าสีของเส้นอนุกรมการเติมเครื่องหมายและสีของเส้นเครื่องหมาย


3

ฉันพยายามเขียนรูทีนย่อย Excel 2010 VBA เพื่อจัดรูปแบบแผนภูมิตามมาตรฐานที่กำหนดไว้ล่วงหน้า (เช่นกำหนดโดยฉัน) คุณลักษณะเฉพาะที่ฉันต้องการตั้งค่าเป็นเพียงคุณลักษณะที่มีให้ผ่านหน้าต่าง Format Data Series ที่เปิดขึ้นเมื่อดับเบิลคลิกหนึ่งครั้งบนชุดข้อมูล

ในความพยายามที่จะค้นหาชื่อของคุณสมบัติต่าง ๆ ที่ฉันจะต้องตั้งค่าฉันบันทึกเป็นแมโครการเปลี่ยนแปลงที่ฉันทำกับสไตล์ของชุดข้อมูล อย่างไรก็ตามถึงแม้ว่าฉันสามารถตั้งค่าสีของเส้นและสีของเส้นบอกตำแหน่งเป็นสีที่แตกต่างกันผ่านหน้าต่างชุดข้อมูลรูปแบบมาโครที่บันทึกไว้

นอกจากนี้เมื่อฉันเรียกใช้แมโครจริงๆมีปัญหาสองประการ ครั้งแรกแม้จะมีความจริงที่ว่าแมโครที่บันทึกไว้อ้างถึงคุณสมบัติการเติมเครื่องหมาย .ForeColor.Brightnessบรรทัดนั้นสร้างข้อผิดพลาดเมื่อเรียกใช้งานแมโคร ข้อผิดพลาดระบุว่า“ วิธีการสว่างของวัตถุ ColorFormat ล้มเหลว” ประการที่สองรหัสที่บันทึกไว้จริง ๆ แล้วตั้งค่าสีของตัวทำเครื่องหมายและบรรทัดหลักสำหรับซีรี่ส์ สีของเส้นจากนั้นทั้งคู่ก็ตั้งค่าเป็นสิ่งที่ฉันต้องการสำหรับสีเส้นหลัก

ฉันจะตั้งค่าการเติมเครื่องหมาย, สีเส้นเครื่องหมายและสีเส้นได้อย่างไร

Sub Macro1()
'
' Macro6 Macro
' On Sheet 1 there is a single embedded chrt 
  ActiveSheet.ChartObjects("Chart 1").Activate
  ActiveChart.SeriesCollection(1).Select
  With Selection.Format.Fill
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorText1
    .ForeColor.TintAndShade = 0
'    The following (recorded line produces an error)
    .ForeColor.Brightness = 0.5
    .Transparency = 0
    .Solid
  End With
  With Selection.Format.Line
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent5
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = 0.400000006
    .Transparency = 0
  End With
  With Selection.Format.Line
    .Visible = msoTrue
    .ForeColor.ObjectThemeColor = msoThemeColorAccent6
    .ForeColor.TintAndShade = 0
    .ForeColor.Brightness = -0.5
    .Transparency = 0
  End With
End Sub

คุณสองคนสุดท้าย with กำลังพูดถึงวัตถุเดียวกัน
Raystafarian

@ เรย์สตาฟาเรียนฉันไม่คิดว่าคุณจะอ่านคำถาม ฉันรู้ว่าพวกเขาพูดถึงวัตถุเดียวกัน นั่นคือประเด็นทั้งหมดของคำถามของฉัน! เหตุใดการบันทึกแมโครของเหตุการณ์ที่เปลี่ยนวัตถุสองชนิดที่แตกต่างกันทำให้เกิดแมโครที่ดูเหมือนจะอ้างอิงวัตถุเดียวกันสองครั้ง และควรอ้างอิงวัตถุใดในแมโครเพื่อให้เกิดการเปลี่ยนแปลงที่ฉันทำด้วยตนเอง
user02814

ฉันได้ต่อสู้กับสิ่งนี้ มีช่องว่างในวิธีที่ VBA จัดการการจัดรูปแบบขององค์ประกอบแผนภูมิเมื่อ Office 2007 ถูกนำออกสู่ตลาด ข้อบกพร่องที่ไม่เคยได้รับการแก้ไขนอกเหนือจากที่ขาด .TintAndShade ถูกปล่อยให้เข้ากันได้ แต่ถูกแทนที่ในปี 2010 โดย .Brightness สำหรับการทำงาน
Jon Peltier

คำตอบ:


4

ดูเหมือนว่าตัวเลือกการจัดรูปแบบเหล่านี้มีการใช้งานค่อนข้างเชื่องช้าใน Excel 2010 และ 2013:

  1. สีและคุณสมบัติของเส้นถูกตั้งค่าเป็นรหัสแมโครได้บันทึกไว้โดยใช้ Series.Format วัตถุและลูก ๆ ของมัน ( Fill, Glow, Shadowฯลฯ [1])
  2. สีเติมเครื่องหมาย ทั้งหมด เครื่องหมายในชุดถูกตั้งค่าด้วย Series.MarkerBackgroundColor หรือ Series.MarkerBackgroundColorIndex. ในทำนองเดียวกันสีของเครื่องหมายสำหรับ ทั้งหมด เครื่องหมายในชุดถูกตั้งค่าด้วย Series.MarkerForegroundColor หรือ Series.MarkerForegroundColorIndex. [2]
  3. อีกทางเลือกหนึ่งการเติมเครื่องหมายและสีของเส้นสามารถตั้งค่า เป็นรายบุคคล ผ่าน Series.Points(n).Format.Fill และ Series.Points(n).Format.Line วัตถุ อย่างไรก็ตาม อย่างน้อยใน Excel 2013 การเปลี่ยนแปลง Series.Points(n).Format.Line.ForeColor ด้วย เปลี่ยนสีของส่วนของเส้นตรงหน้าจุดข้อมูลที่เกี่ยวข้องทันที

คุณสมบัติของ # 2 ดูเหมือนโฮลเดอร์จาก Excel DOM ก่อนหน้าแม้ว่าจะมีฟังก์ชันการทำงานที่เพิ่มขึ้นในแง่ของ .MarkerForegroundColor และ .MarkerBackGroundColor ยอมรับค่า RGB ใด ๆ สิ่งที่อยู่ในอันดับที่ 3 นั้นสอดคล้องกับระดับความสามารถในการกำหนดค่าใหม่ที่พบใน Excel 2010 และรุ่นที่ใหม่กว่า สิ่งหนึ่งที่น่ารำคาญของ bugginess ก็คือปรากฏว่าสีของตัวทำเครื่องหมายมีปัญหาเกี่ยวพันกับสีของเส้นอนุกรม - เท่าที่ฉันบอกได้มันเป็นไปไม่ได้ที่จะเปลี่ยนสีของเส้น ในทางกลับกัน โดยเฉพาะอย่างยิ่งมันจะปรากฏว่าเป็นไปไม่ได้ที่จะได้สีของชุดรูปแบบที่เหมือนกันในขณะที่ยังใช้การเปลี่ยนแปลงแบบจุดต่อจุดในสีของตัวทำเครื่องหมายด้วย VBA (อีกครั้งฉันกำลังทดสอบที่นี่ใน Excel 2013; 2010 อาจทำงานแตกต่างออกไป)

ในกรณีใด ๆ ในสถานการณ์ที่ไม่จำเป็นต้องใช้การปรับแต่งสีแบบจุดต่อจุดฟังก์ชันตัวช่วยเช่นต่อไปนี้อาจเป็นประโยชน์สำหรับการเปลี่ยนแปลงสีของเส้นโดยไม่ส่งผลกระทบต่อการเติมเครื่องหมายหรือสีเส้น เป็นค่า Long RGB [3]):

Sub ChangeLineColorOnly(srs as Series, newLineColor as Long)
    Dim oldMkrFill as Long, oldMkrLine as Long

    ' Store old marker colors
    oldMkrFill = srs.MarkerBackgroundColor
    oldMkrLine = srs.MarkerForegroundColor

    ' Set the series ForeColor
    srs.Format.Fill.ForeColor.RGB = newLineColor

    ' Restore the old marker colors
    srs.MarkerBackgroundColor = oldMkrFill
    srs.MarkerForegroundColor = oldMkrLine

End Sub

ฟังก์ชันตัวช่วยด้านบนรุ่นทางเลือกสามารถเขียนได้ง่ายเพื่อให้เหมาะกับสีที่ระบุว่าเป็น SchemeColor [4] หรือเก็บเฉพาะสีเส้นเครื่องหมาย

ในฐานะที่เป็น .ForeColor.Brightness ความผิดพลาดก็น่าจะเป็นผลมาจากการบันทึกฟังก์ชั่น 'Record Macro' อย่างไม่ระมัดระวังในการพัฒนา Excel 2010 มันควรจะถูกแทรกลงในรหัส VBA ที่บันทึกไว้สำหรับแผนภูมิบางประเภทเท่านั้น .Brightness เป็นแอตทริบิวต์ที่ถูกต้องที่จะแก้ไข

[1] http://msdn.microsoft.com/en-us/library/office/ff839279(v=office.14).aspx
[2] http://msdn.microsoft.com/en-us/library/office/ff840677(v=office.14).aspx
[3] http://msdn.microsoft.com/en-us/library/zc1dyw8b%28v=vs.90%29.aspx
[4] http://msdn.microsoft.com/en-us/library/office/ff836764(v=office.14).aspx


แน่นอน, .Brightness เป็นแอตทริบิวต์ที่ถูกต้องที่จะแก้ไขด้วยตนเองผ่าน Excel UI มันเพิ่งหยุดพักใน VBA
Jon Peltier

@JonPeltier เคยมีมาตั้งแต่ฉันเขียนสิ่งนี้ แต่ IIRC บางประเภทแผนภูมิไม่สนับสนุน .Brightness และทำให้มันกลายเป็นข้อมูลอ้างอิงที่ไม่ได้กำหนดในกรณีเหล่านั้น ดังนั้นข้อผิดพลาดคุณสมบัติ (หรืออะไรก็ตาม) ที่ส่งออกโดย VBA ในสถานการณ์ของ OP
hBy2Py

ฉันไม่คิดว่ามันเป็นประเภทแผนภูมิเท่าองค์ประกอบ ฉันเคยเห็นเท่านั้น .Brightness โยนข้อผิดพลาดเมื่อคุณพยายามปรับ .Brightness ของสีเติม (พื้นหลัง) ของเครื่องหมาย (ดีใช่บางประเภทแผนภูมิเท่านั้นที่มีเครื่องหมาย แต่ทั้งหมดเป็นเครื่องหมายและไม่มีอะไรอื่น) มันบันทึกดีล้มเหลวในการเล่น หมายเหตุถึงตนเอง: ลอง .TintAndShade.
Jon Peltier

@ JonPeltier น่าจะเป็นไปได้ ฉันไม่ได้ทำการตรวจสอบอย่างละเอียดถี่ถ้วนเกี่ยวกับสิ่งที่ทำให้ VBA ระเบิด
hBy2Py

ใช่, .TintAndShade ไม่มีผล ดังนั้นเราจึงไม่สามารถใช้อย่างนั้นหรือ .Brightness เพื่อปรับสีในตัวสำหรับการเติมเครื่องหมาย สำหรับเส้นขอบเครื่องหมายโดยบังเอิญทั้งคู่ .Brightness และ .TintAndShade ส่งผลกระทบต่อความสว่างของสีของเส้น แต่ยังเปลี่ยนเส้นขอบเครื่องหมายเป็นสีก่อนหน้า ดังนั้นพวกมันก็ไร้ประโยชน์เช่นกัน
Jon Peltier

0

มันใช้งานได้สำหรับฉัน

   ActiveChart.FullSeriesCollection(1).Select
    With Selection.Format.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
        .Solid
    End With
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Transparency = 0
    End With

-1

ผม คิดว่า สิ่งนี้ใช้ได้กับฉันเช่นกันยกเว้นว่ามันจะเปลี่ยนสีแดงเติมไม่ว่าค่า RGB ที่ฉันใส่จะเป็นยังไง

ActiveChart.FullSeriesCollection (1) .Select     ด้วยการเลือกรูปแบบเติม         .Visible = msoTrue         .ForeColor.RGB = RGB (255, 0, 0)         .Transparency = 0         ทึบ     จบด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.