Code VBA để vẽ biểu đồ hàng loạt ?

Liên hệ QC

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Mình cần vẽ nhiều biểu đồ biểu diễn giá trị từng cột Biến 1, Biến 2, Biến 3... với 2 cột cố định trục thời gian và cột hằng số ( trong file mình có biểu đồ mẫu ) . Đây là file đính kèm nhờ các bạn viết code giúp mình. Cảm ơn diễn đàn !
 

File đính kèm

  • VBA vẽ biểu đồ.xlsm
    25.4 KB · Đọc: 24
Mình cần vẽ nhiều biểu đồ biểu diễn giá trị từng cột Biến 1, Biến 2, Biến 3... với 2 cột cố định trục thời gian và cột hằng số ( trong file mình có biểu đồ mẫu ) . Đây là file đính kèm nhờ các bạn viết code giúp mình. Cảm ơn diễn đàn !
Phải bạn muốn như này không?
1595582559421.png
1595582586592.png
1595582610171.png
VBA tôi không thạo, cần power Bi thì tôi gửi cho bạn
 
Phải bạn muốn như này không?
View attachment 241758
View attachment 241759
View attachment 241760
VBA tôi không thạo, cần power Bi thì tôi gửi cho bạn
Cảm ơn bạn đã xem giúp mình. trong file đính kèm mình đã có biểu đồ mẫu rồi đó bạn. mình cẫn vẽ biểu đồ đơn giản thôi. cần định dạng biểu đồ như trong file mà màu sắc cũng đúng như biểu đồ mẫu đó bạn ạ.
Vấn đề ở đây là trong file đầy đủ số lượng cột cần vẽ rất nhiều lên cần dùng VBA để vẽ hàng loạt chứ vẽ thủ công thì lâu lắm. hi mình k biết code như nào để gán được dữ liệu vào biểu đồ
Bài đã được tự động gộp:

Excel với BI cũng như nhau, không cần dùng VBA
View attachment 241763
Tớ chưa hiểu lắm. nếu không dùng VBA thì sẽ phải làm như nào để tạo ra nhiều biểu đồ theo lần lượt các cột dữ liệu được?
kết quả cuối cùng mà mình cần là các biểu đồ nằm trên cùng 1 sheet và liên tiếp nhau như này:
1595586220705.png
 
Lần chỉnh sửa cuối:
Cảm ơn bạn đã xem giúp mình. trong file đính kèm mình đã có biểu đồ mẫu rồi đó bạn. mình cẫn vẽ biểu đồ đơn giản thôi. cần định dạng biểu đồ như trong file mà màu sắc cũng đúng như biểu đồ mẫu đó bạn ạ.
Vấn đề ở đây là trong file đầy đủ số lượng cột cần vẽ rất nhiều lên cần dùng VBA để vẽ hàng loạt chứ vẽ thủ công thì lâu lắm. hi mình k biết code như nào để gán được dữ liệu vào biểu đồ
Đó là bạn chưa biết đó thôi, Power bi xử lý biểu đồ rất mạnh mẽ! VBA sẽ không theo được nó đâu bạn! Hình mình gửi có Slicer chữ "Biến" ý, bạn bấm vào biến nào nó nhảy biểu đồ biến đó, bấm đồng thời nhiều biến thì nó vẽ gộp nhiều biến. Nó không phải thủ công như bạn nghĩ đâu!
 
Đó là bạn chưa biết đó thôi, Power bi xử lý biểu đồ rất mạnh mẽ! VBA sẽ không theo được nó đâu bạn! Hình mình gửi có Slicer chữ "Biến" ý, bạn bấm vào biến nào nó nhảy biểu đồ biến đó, bấm đồng thời nhiều biến thì nó vẽ gộp nhiều biến. Nó không phải thủ công như bạn nghĩ đâu!
mình k biết power Bi rồi. vậy bạn gửi cho mình xin file bạn làm như nào mình nghiên cứu
 
mình k biết power Bi rồi. vậy bạn gửi cho mình xin file bạn làm như nào mình nghiên cứu
Mình gửi ở đính kèm nhé!
Bạn có thể tạo một slicer vẽ biểu đồ trong excel( như bạn ở bài #3) đã nói ở trên thì cũng xử lý được vấn đề của bạn. Yêu cầu chỉ thế thì không cần VBA đâu, không nên lạm dụng VBA.
 

File đính kèm

  • Biểu đồ cột.rar
    60.1 KB · Đọc: 23
Sub Ve_bieu_do()
Dim myChartObject As ChartObject
Set myChartObject = ActiveSheet.ChartObjects.Add(Left:=500, Top:=10, _
Width:=400, Height:=300)
myChartObject.Chart.SetSourceData Source:= _
ActiveWorkbook.Sheets("Bieu do").Range("A1:E3")

End Sub

Mình tìm được đoạn code này nhưng không biết phải làm thế nào để ra được kết quả như mong muốn
Bài đã được tự động gộp:

Mình gửi ở đính kèm nhé!
Bạn có thể tạo một slicer vẽ biểu đồ trong excel( như bạn ở bài #3) đã nói ở trên thì cũng xử lý được vấn đề của bạn. Yêu cầu chỉ thế thì không cần VBA đâu, không nên lạm dụng VBA.
Nếu có thể mình vẫn muốn dùng VBA vì nó có thể làm hàng loạt tốt hơn làm thủ công bạn ạ, tại mình không phải người hiểu code bạn có thể xem sửa giúp mình đoạn code sau thành biểu đồ giống trong file excel mà mình gửi không bạn?

Sub Ve_bieu_do()
Dim myChartObject As ChartObject
Set myChartObject = ActiveSheet.ChartObjects.Add(Left:=500, Top:=10, _
Width:=400, Height:=300)
myChartObject.Chart.SetSourceData Source:= _
ActiveWorkbook.Sheets("Bieu do").Range("A1:E3")
End Sub
 
Lần chỉnh sửa cuối:
Mình gửi ở đính kèm nhé!
Bạn có thể tạo một slicer vẽ biểu đồ trong excel( như bạn ở bài #3) đã nói ở trên thì cũng xử lý được vấn đề của bạn. Yêu cầu chỉ thế thì không cần VBA đâu, không nên lạm dụng VBA.
Có thể không dùng unpivot mà vẫn tạo report như vậy được không bạn, unpivot với dữ liệu nhiều và sẽ làm chậm report
 
Có thể không dùng unpivot mà vẫn tạo report như vậy được không bạn, unpivot với dữ liệu nhiều và sẽ làm chậm report
Tớ không hiểu unpivot. tớ muốn dùng VBA. bạn có thể sửa được đoạn code kia để tạo ra mẫu biểu đồ như mình mong muốn được không? Mình muốn nó lằm lần lượt trên cùng 1 sheet như này1595592834942.png1595592834942.png
1595592834942.png
 
Tớ không hiểu unpivot. tớ muốn dùng VBA. bạn có thể sửa được đoạn code kia để tạo ra mẫu biểu đồ như mình mong muốn được không? Mình muốn nó lằm lần lượt trên cùng 1 sheet như nàyView attachment 241770View attachment 241770
View attachment 241770
Thích thì cho bạn code, làm theo file mẫu, chưa format chart, bạn tự tìm hiểu thêm
Mã:
Sub a()
Dim chrt As Chart, i As Long
For i = 1 To 5
    Set chrt = ActiveSheet.Shapes.AddChart2(201, xlColumnClustered, 100 + (i - 1) * 500, 50, 400, 300).Chart
    With chrt
        .SetSourceData Source:=Range("a1:b22")
        .SeriesCollection(1).ChartType = xlLine
        .SeriesCollection(1).AxisGroup = 1
        With .SeriesCollection.NewSeries
            .Values = Range("b2:b22").Offset(, i)
            .Name = [c1].Offset(, i)
            .ChartType = xlColumnClustered
            .AxisGroup = 2
        End With
    End With
Next
End Sub
 
Thích thì cho bạn code, làm theo file mẫu, chưa format chart, bạn tự tìm hiểu thêm
Mã:
Sub a()
Dim chrt As Chart, i As Long
For i = 1 To 5
    Set chrt = ActiveSheet.Shapes.AddChart2(201, xlColumnClustered, 100 + (i - 1) * 500, 50, 400, 300).Chart
    With chrt
        .SetSourceData Source:=Range("a1:b22")
        .SeriesCollection(1).ChartType = xlLine
        .SeriesCollection(1).AxisGroup = 1
        With .SeriesCollection.NewSeries
            .Values = Range("b2:b22").Offset(, i)
            .Name = [c1].Offset(, i)
            .ChartType = xlColumnClustered
            .AxisGroup = 2
        End With
    End With
Next
End Sub

Mình định tách làm hai phần. mình sẽ copy biểu đồ mẫu ra hàng loạt biểu đồ sau đó sẽ đổi công thức giá trị cho biểu đồ. Bạn ơi cho mình hỏi giờ làm thế nào để thay đổi được chữ D này nhỉ ? ( khi i =2 thì "=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)". Khi i =3 thì "=SERIES(Data!$E$1;Data!$A$2:$A$22;Data!$E$2:$E$22;1)"


Sub gan_gia_tri_cho_Bieu_Do()
Dim i As Integer
Dim dulieu As String ?
For i = 2 To 5
ActiveSheet.ChartObjects(i).Activate
ActiveChart.SeriesCollection(1).Formula = "=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)"
End Sub
 
Mình định tách làm hai phần. mình sẽ copy biểu đồ mẫu ra hàng loạt biểu đồ sau đó sẽ đổi công thức giá trị cho biểu đồ. Bạn ơi cho mình hỏi giờ làm thế nào để thay đổi được chữ D này nhỉ ? ( khi i =2 thì "=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)". Khi i =3 thì "=SERIES(Data!$E$1;Data!$A$2:$A$22;Data!$E$2:$E$22;1)"


Sub gan_gia_tri_cho_Bieu_Do()
Dim i As Integer
Dim dulieu As String ?
For i = 2 To 5
ActiveSheet.ChartObjects(i).Activate
ActiveChart.SeriesCollection(1).Formula = "=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)"
End Sub
Đổi source lại là được bạn
ActiveChart.SeriesCollection(2).Values = ActiveSheet.Range("b2:b22").Offset(, i)
ActiveChart.SeriesCollection(2).Name = [c1].Offset(, i)
 
Đổi source lại là được bạn
ActiveChart.SeriesCollection(2).Values = ActiveSheet.Range("b2:b22").Offset(, i)
ActiveChart.SeriesCollection(2).Name = [c1].Offset(, i)
Cảm ơn bạn đã hướng dẫn
Mình xin viết lại code cho ai cần thì tham khảo:

Sub gan_gia_tri_cho_Bieu_Do()
Dim i As Integer
Dim dulieu As String
For i = 1 To 5
ActiveSheet.ChartObjects(i).Activate
ActiveChart.SeriesCollection(1).Values = Sheets("Data").Range("b2:b22").Offset(, i)
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[c1].Offset(, i)
Next i
End Sub

Bạn cho mình hỏi thêm là kết quả sau khi chạy VBA code trên thì chỗ công thức của biểu đồ nó ra như này

=SERIES(;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Còn đây là công thức cũ ( khi mình vẽ biểu đồ thủ công )
=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Cho mình hỏi không biết hai công thức khác nhau vậy có làm cho biểu đồ bị sai gì không bạn ?
Bài đã được tự động gộp:

Cảm ơn bạn đã hướng dẫn
Mình xin viết lại code cho ai cần thì tham khảo:

Sub gan_gia_tri_cho_Bieu_Do()
Dim i As Integer
Dim dulieu As String
For i = 1 To 5
ActiveSheet.ChartObjects(i).Activate
ActiveChart.SeriesCollection(1).Values = Sheets("Data").Range("b2:b22").Offset(, i)
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[c1].Offset(, i)
Next i
End Sub

Bạn cho mình hỏi thêm là kết quả sau khi chạy VBA code trên thì chỗ công thức của biểu đồ nó ra như này

=SERIES(;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Còn đây là công thức cũ ( khi mình vẽ biểu đồ thủ công )
=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Cho mình hỏi không biết hai công thức khác nhau vậy có làm cho biểu đồ bị sai gì không bạn ?
Mình thấy rồi khi mình thay đổi tiêu đề ở cột D, thì bên biểu đồ tên lại không tự động thay đổi theo bạn ạ. trong mục thông tin của biểu đồ bị mất phần Name. Bạn sửa giúp mình công thức trong code VBA trên để khắc phục tình trạng này nhé. Cảm ơn bạn !
1595605165338.png
 
Lần chỉnh sửa cuối:
Cảm ơn bạn đã hướng dẫn
Mình xin viết lại code cho ai cần thì tham khảo:

Sub gan_gia_tri_cho_Bieu_Do()
Dim i As Integer
Dim dulieu As String
For i = 1 To 5
ActiveSheet.ChartObjects(i).Activate
ActiveChart.SeriesCollection(1).Values = Sheets("Data").Range("b2:b22").Offset(, i)
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[c1].Offset(, i)
Next i
End Sub

Bạn cho mình hỏi thêm là kết quả sau khi chạy VBA code trên thì chỗ công thức của biểu đồ nó ra như này

=SERIES(;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Còn đây là công thức cũ ( khi mình vẽ biểu đồ thủ công )
=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

Cho mình hỏi không biết hai công thức khác nhau vậy có làm cho biểu đồ bị sai gì không bạn ?
Bài đã được tự động gộp:


Mình thấy rồi khi mình thay đổi tiêu đề ở cột D, thì bên biểu đồ tên lại không tự động thay đổi theo bạn ạ. trong mục thông tin của biểu đồ bị mất phần Name. Bạn sửa giúp mình công thức trong code VBA trên để khắc phục tình trạng này nhé. Cảm ơn bạn !
View attachment 241777
Đã có dòng code thay đổi Name rồi mà:
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[c1].Offset(, i)
bạn sữa lại thành
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[b1].Offset(, i) thử xem, không được bạn gửi file nên tôi xem thử
 
Đã có dòng code thay đổi Name rồi mà:
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[c1].Offset(, i)
bạn sữa lại thành
ActiveChart.SeriesCollection(1).Name = Sheets("Data").[b1].Offset(, i) thử xem, không được bạn gửi file nên tôi xem thử
mình vừa nhầm c1, b1.
ý mình muốn nói là nếu ở chỗ công thức nếu là vẽ biểu đồ thủ công bằng tay thì
Còn đây là công thức cũ ( khi mình vẽ biểu đồ thủ công )
=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1) khi đó sau khi vẽ xong biểu đồ nếu ta thay đổi tên tiêu đề ở cột D thì tên trên biểu đồ cũng thay đổi.

nhưng khi mình vẽ biểu đồ bằng Code VBA kia thì nó gán giá trị của D1 làm tên của biểu đồ luôn. Khi thay đổi tên D1 thì tên trên biểu đồ nó không tự động thay đổi theo: ActiveChart.SeriesCollection(1).Name = Sheets("Data").[b1].Offset(, i)

dòng công thức khi vẽ bằng VBA nó là như này: =SERIES(;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

nó bị thiếu mất chỗ bôi đỏ so với khi vẽ thủ công bạn ạ

1595606620296.png
Bài đã được tự động gộp:

Mình gửi bạn file bạn xem giúp mình.
 

File đính kèm

  • VBA vẽ biểu đồ - thay đổi tên cột.xlsm
    39.6 KB · Đọc: 8
Lần chỉnh sửa cuối:
mình vừa nhầm c1, b1.
ý mình muốn nói là nếu ở chỗ công thức nếu là vẽ biểu đồ thủ công bằng tay thì
Còn đây là công thức cũ ( khi mình vẽ biểu đồ thủ công )
=SERIES(Data!$D$1;Data!$A$2:$A$22;Data!$D$2:$D$22;1) khi đó sau khi vẽ xong biểu đồ nếu ta thay đổi tên tiêu đề ở cột D thì tên trên biểu đồ cũng thay đổi.

nhưng khi mình vẽ biểu đồ bằng Code VBA kia thì nó gán giá trị của D1 làm tên của biểu đồ luôn. Khi thay đổi tên D1 thì tên trên biểu đồ nó không tự động thay đổi theo: ActiveChart.SeriesCollection(1).Name = Sheets("Data").[b1].Offset(, i)

dòng công thức khi vẽ bằng VBA nó là như này: =SERIES(;Data!$A$2:$A$22;Data!$D$2:$D$22;1)

nó bị thiếu mất chỗ bôi đỏ so với khi vẽ thủ công bạn ạ

View attachment 241778
Khi thay đổi bạn phải chạy lại code nó mới update lại, thôi để tôi chỉnh trong formula luôn, để update tự động, bạn nhận lại file!
 

File đính kèm

  • VBA vẽ biểu đồ - thay đổi tên cột.xlsm
    51.5 KB · Đọc: 18
Thích thì cho bạn code, làm theo file mẫu, chưa format chart, bạn tự tìm hiểu thêm
Mã:
Sub a()
Dim chrt As Chart, i As Long
For i = 1 To 5
    Set chrt = ActiveSheet.Shapes.AddChart2(201, xlColumnClustered, 100 + (i - 1) * 500, 50, 400, 300).Chart
    With chrt
        .SetSourceData Source:=Range("a1:b22")
        .SeriesCollection(1).ChartType = xlLine
        .SeriesCollection(1).AxisGroup = 1
        With .SeriesCollection.NewSeries
            .Values = Range("b2:b22").Offset(, i)
            .Name = [c1].Offset(, i)
            .ChartType = xlColumnClustered
            .AxisGroup = 2
        End With
    End With
Next
End Sub

bạn ơi cho mình hỏi mình chạy code này thì báo lỗi tại dòng : Set chrt = ActiveSheet.Shapes.AddChart2(201, xlColumnClustered, 100 + (i - 1) * 500, 50, 400, 300).Chart
1595644440250.png
 
Web KT
Back
Top Bottom