Thay đổi chart type theo dữ liệu

Liên hệ QC

summerhq2006

Thành viên hoạt động
Tham gia
4/3/08
Bài viết
112
Được thích
88
Em có một bảng gồm chi phí và lãi/lỗ. Nếu kết quả lãi thì biểu đồ thể hiện là biểu đồ hình tròn, ngược lại thì là biểu đồ hình cột. (Giống như hàm if ý). Các bác có thể chỉ cho em cách làm được không ah? Em gửi file đính kèm!
 

File đính kèm

  • Dothi.rar
    3.1 KB · Đọc: 77
Em có một bảng gồm chi phí và lãi/lỗ. Nếu kết quả lãi thì biểu đồ thể hiện là biểu đồ hình tròn, ngược lại thì là biểu đồ hình cột. (Giống như hàm if ý). Các bác có thể chỉ cho em cách làm được không ah? Em gửi file đính kèm!
  1. Theo mình nghĩ thì điều này là không tưởng nếu chỉ dùng công thức và vẽ biểu đồ theo cách thông thường (có thể ví như: 1 người đi trên đường. Nếu vận tốc > 5km/h thì người đó đang đi bằng ôtô, nếu vận tốc <5 km/h thì người đó đang đi bộ)
  2. Còn dùng VBA thì có thể làm được hay không thì mình không biết (phải nhờ các cao thủ khác)
  3. Biểu đồ trong Excel là 1 dạng mô tả số liệu bằng hình ảnh. Vậy đâu cần thay đổi đến cách thể hiện của loại biểu đồ mới nhận ra là lãi hay lỗ ...
 
Mình làm thế này mà được nè, chưa rành lắm!

Mình ghi bằng bộ thu macro của excel được 2 macro tương ứng để vẽ 2 loại đồ thị cho 2 trường hợp tương ứng mà bạn cần;
Trong mỗi macro, mình thêm vô 2 dòng lệnh (trên cùng của mỗi chúng)
Hai cái đó như sau:
Option Explicit

PHP:
Sub DoThi01()
 On Error Resume Next
    ActiveWorkbook.Charts.Delete
    Range("A1:F2").Select
    Charts.Add
    ActiveChart.ChartType = xl3DPie
    ActiveChart.SetSourceData Source:=Sheets("Sheet2").Range("A1:F2"), PlotBy:= _
        xlRows
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet2"
    ActiveSheet.Shapes("Chart 2").IncrementLeft -162#
    ActiveSheet.Shapes("Chart 2").IncrementTop -54.75
    ActiveChart.SeriesCollection(1).Select
    Selection.Explosion = 9
End Sub
'    *        *        *        *        *        *        *        *    '
Sub DoThi02()
 On Error Resume Next
    ActiveWorkbook.Charts.Delete
    Range("A1:F2").Select
    Charts.Add
    ActiveChart.ChartType = xlColumnClustered
    ActiveChart.SetSourceData Source:=Sheets("Sheet2").Range("A1:F2"), PlotBy:= _
        xlRows
    ActiveChart.Location Where:=xlLocationAsObject, Name:="Sheet2"
    ActiveSheet.Shapes("Chart 3").IncrementLeft 124.5
    ActiveSheet.Shapes("Chart 3").IncrementTop -45#
End Sub

Bước cuối là phải chuột vô Sheet2 của thanh sheetNames ; chọn dòng cuối để excel mở CS VBE & chép đoạn Code này vô:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
   If Not Intersect(Target, [f2]) Is Nothing Then _
      If Target < 0 Then DoThi02 Else DoThi01
End Sub

( Cần nói thêm là trước đó mình đã Copy dữ liệu để vẽ đồ thị tứ sheet1 đến vùng $A$1:$F$2 của sheet2)
Cho nên khi thay đổi trong F2 thì có đồ thị thay đổi
Nếu bạn chưa thực thi theo mô tả thì mình sẽ gời file lên; Lúc đó bạn sẽ mất đi 1 ít hứng thú!!

Chúc vui!
 
  1. Theo mình nghĩ thì điều này là không tưởng nếu chỉ dùng công thức và vẽ biểu đồ theo cách thông thường (có thể ví như: 1 người đi trên đường. Nếu vận tốc > 5km/h thì người đó đang đi bằng ôtô, nếu vận tốc <5 km/h thì người đó đang đi bộ)
Em không nghĩ như vậy, mà em nghĩ như sau: Nếu vận tốc > 5km/h thì người đó đang đi với tốc độ của ôtô, nếu vận tốc <5 km/h thì người đó đang đi với tốc độ của người đi bộ)
Cám ơn bác!
 
Bạn AnhTuan1066 ơi giúp mình vẽ cái biểu đồ này với.
 

File đính kèm

  • bieu do.rar
    60.5 KB · Đọc: 43
Bạn AnhTuan1066 ơi giúp mình vẽ cái biểu đồ này với.
* Bạn viết thế này, lỡ AnhTuan1066 đi công tác xa cả tháng, chắc bạn cũng đợi ư?
Hơn nữa khi AnhTuan1066 về chắc gì đã thấy bài của bạn (Trừ phi bạn đã nhắn tin)
* Nói thế này khí không phải, biết đâu lĩnh vực biểu đồ tự động hóa này 1 vài người khác ngon hơn AnhTuan1066 thì mần răng bây chừ?

Vui thôi;
Ta vô công việc của bạn đi:
Bước đầu 1 số điều chưa hiểu cần hỏi lại:
+ Mình thử sửa 1 số số liệu bên 'BieuDo' thì đồ thị thay đổi
Vậy bạn cho biết các số liệu các ô nào bên 'BieuDo' cần được chép tự động từ 'DaTa'

Tạm thời bạn kiểm xem với macro này:
PHP:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
On Error Resume Next
 Dim Rng As Range, Clls As Range
 Set Rng = Range("C4:c8")
 If Not Intersect(Target, Rng) Is Nothing And Target = 1 Then
   With Sheets("Bieu Do")
      .[c9] = Cells(Target.Row, 6):       .[d9] = Cells(Target.Row, 13)
      .[f9] = Cells(Target.Row, 14):      .[h9] = Cells(Target.Row, 15)
      .[d8] = Cells(Target.Row, 7):       .[f8] = Cells(Target.Row, 8)
      .[h8] = Cells(Target.Row, 9)
   End With
 End If
End Sub
 
Trước hết mình cảm ơn bạn SA_DQ đã quan tâm. Mình giải thích rõ cho bạn hiểu nhe.
VD: khi bạn muốn xem biểu đồ của tên trong cột "Pile Name" bên sheet "DATA" thì bạn chỉ cần gõ số 1 phía trước cái tên bạn muốn xem( như P210,P211,....P214). Sau đó bên sheet "Bieu Do" tuỳ theo số lượng xe của từng cọc mà số liệu trong 2 dòng 9,10 của các cột D:E,F:G,H:I,J:K,L:M,N sẽ tự động hiện ra và vùng dữ liệu 2 dòng 9,10 cho biểu đồ sẽ dao động từ cột D đến cột N. Do trong các cell mình đã đặt sẵn công thức khi không có dữ liệu từ bảng DATA thì giá trị của các cell là "", nhưng vùng dữ liệu của biểu đổ không hiểu giá trị "".
Bác xem có cách nào sửa giúp e nhe. Cảm ơn
 
Trong ví dụ của bạn, bạn đang xét đến dòng thứ 6;
Trong macro của mình ghi cho bạn cũng sẽ đúng trên dòng này; À mà bạn thử với macro của mình hay chưa; Nếu chưa thì nên thử;

Vẫn còn 1 điều chưa rõ khi trường hợp dòng 8 sảy ra; vậy bảng số liệu bên đồ thị sẽ như thế nào đây?

Theo mình hiểu, hình như dữ liệu từ bên Data sẽ chép vô dòng 8 & 9 của DoThi;
Cụ thể là từ D8:N8 & C9:N9
còn dòng 10 công thức tính gán sẵn thôi mà!

Macro của mình mới chép dữ liệu 7 ô (trường hợp dòng 6) còn thiếu 6 ô nữa ứng với trường hợp 8. & cần nói thêm rằng số liệu từ 'DoThi'!D8:N9 sẽ do macro đảm trách chép lại mỗi lần, một khi ta nhập số 1 vô dòng tương ứng trong vùng 'DuLieu'!C4:C8

Vấn đề nữa: Bạn làm gì trộn các ô chi cho cực vậy; Đẹp thì có đẹp nhưng quá sớm để làm điều đó.
 
Cảm ơn bạn đã hồi âm, mình cũng đã thử mảco cua bạn rồi nhưng không được bạn ơi, excell bị treo luôn. Mình chỉ muốn vùng dữ liệu của biểu đổ thay đổi thôi giống như biểu đồ động đó (Dynamic chart) vậy thôi bạn có giúp mình được không? Cảm ơn nhé
 
Đang rộn chuyện với dự án, nhưng chảng lẽ nữa vời, đành vậy

Cảm ơn bạn đã hồi âm, mình cũng đã thử mảco cua bạn rồi nhưng không được bạn ơi, excell bị treo luôn. Mình chỉ muốn vùng dữ liệu của biểu đổ thay đổi thôi giống như biểu đồ động đó (Dynamic chart) vậy thôi bạn có giúp mình được không? Cảm ơn nhé
Bạn xem thêm trong file đính kèm, có cả hướng sử dụng & chúc vui!
PHP:
Option Explicit

Sub TuDongVeBieuDo()
 On Error Resume Next
 Dim Rng As Range, Clls As Range, rSelec As Range
 
 Sheets("DaTa").Select
 Set Rng = Range("C4:c18"):       Set rSelec = Selection.Offset(-1)
 
 If Not Intersect(rSelec, Rng) Is Nothing And rSelec = 1 Then
   
   With Sheets("Bieu Do")
      .Range("D8:N8").ClearContents:      .Range("C9:N9").ClearContents
      
      .[c9] = rSelec.Offset(, 3):         .[d9] = rSelec.Offset(, 10)
      .[f9] = rSelec.Offset(, 11):        .[h9] = rSelec.Offset(, 12)
      .[J9] = rSelec.Offset(, 13):        .[L9] = rSelec.Offset(, 14)
      .[N9] = rSelec.Offset(, 15):
      
      .[d8] = rSelec.Offset(, 4):         .[f8] = rSelec.Offset(, 5)
      .[h8] = rSelec.Offset(, 6):         .[j8] = rSelec.Offset(, 7)
      .[L8] = rSelec.Offset(, 8):         .[N8] = rSelec.Offset(, 9)
      
   End With
 End If
 
 For Each Clls In Rng
      If Clls.Address <> rSelec.Address Then Clls = ""
 Next Clls
 Sheets("Bieu Do").Select
End Sub
 

File đính kèm

  • GPE.COM.rar
    67.7 KB · Đọc: 84
Cảm ơn bạn SA_QD rất nhiều vì bạn đã hướng dẫn tận tình. Nhưng kết quả mình muốn không phải như vậy. Để mình giải thích thêm cho bạn hiểu nhe. Cái mình muốn là biểu đồ tự động vẽ( loại biểu đồ như file mình đã gửi), vùng dữ liệu của biểu đồ sẽ tự động thay đổi của 2 dòng 9,10 từ cột C đến cột N của "biểu đồ", mình nghỉ nên sử dụng vùng dữ liệu động, nhưng mình không biết làm cách nào.mình có gửi kèm 2 hình minh hoạ nhờ bạn xem và giúp mình nhe. Cảm ơn rẩt nhiều.


-------------------------
Bạn có gửi câu hỏi, thì gửi ở một topic thôi nhé. Đừng gửi cùng câu hỏi trong nhiều topic.
 

File đính kèm

  • 1.jpg
    1.jpg
    30.3 KB · Đọc: 23
  • 2.jpg
    2.jpg
    29.4 KB · Đọc: 9
Chỉnh sửa lần cuối bởi điều hành viên:
Web KT
Back
Top Bottom