Làm thế nào để tìm được giá trị Min rồi đặt nó cho tỉ lệ trên biểu đồ ? (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

phamvandunghp84

Thành viên thường trực
Tham gia
5/3/20
Bài viết
241
Được thích
12
Bạn ơi cho mình hỏi mình muốn đổi tọa độ theo giá trị nhỏ nhất, trong tình huống cột giá trị không có giá trị #NA thì code này hoạt động tốt. nhưng trong trường hợp chuỗi srs1, srs2 có chứa giá trị #NA ? Mình muốn bỏ qua giá trị #NA để lấy giá trị nhỏ nhất làm tỉ lệ biểu đồ nhưng code này nó luôn ra =0.

Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series
Dim srs2 As Series

On Error Resume Next
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)
Set srs2 = ActiveChart.SeriesCollection(2)

Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs1.Values)
Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs2.Values)
End With

Set srs1 = Nothing
Set srs2 = Nothing
Next i
On Error Resume Next
End Sub
 
Bạn ơi cho mình hỏi mình muốn đổi tọa độ theo giá trị nhỏ nhất, trong tình huống cột giá trị không có giá trị #NA thì code này hoạt động tốt. nhưng trong trường hợp chuỗi srs1, srs2 có chứa giá trị #NA ? Mình muốn bỏ qua giá trị #NA để lấy giá trị nhỏ nhất làm tỉ lệ biểu đồ nhưng code này nó luôn ra =0.

Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series
Dim srs2 As Series

On Error Resume Next
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)
Set srs2 = ActiveChart.SeriesCollection(2)

Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs1.Values)
Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs2.Values)
End With

Set srs1 = Nothing
Set srs2 = Nothing
Next i
On Error Resume Next
End Sub
Code lạ quá, lấy tính toán thì lấy luôn từ ngoài sheet dữ liệu đi
Application.WorksheetFunction.Subtotal(105, srs1.Values)

thay srs1.Value --- thành Value từ vùng chứa dữ liệu của serries đó
 
Code lạ quá, lấy tính toán thì lấy luôn từ ngoài sheet dữ liệu đi
Application.WorksheetFunction.Subtotal(105, srs1.Values)

thay srs1.Value --- thành Value từ vùng chứa dữ liệu của serries đó
tình huống của mình là có biểu đồ trước rồi. vậy giờ mình muốn đọc từ biểu đồ ra vùng dữ liệu đó thì code như nào bạn nhỉ ?
mình giải thích rõ hơn như này:

đây là công thức để gán vùng B1:B5 vào biểu đồ,
Charts("Chart1").SeriesCollection(1).XValues = _ Worksheets("Sheet1").Range("B1:B5")

bây mình chỉ có biểu đồ trước rồi và muốn đọc lại giá trị B1:B5 kia vào thì viết lại như nào? mình thử như này nhưng k được:

Set cht = ActiveChart
Dim vung As Range
vung = cht.SeriesCollection(1).XValues
Sheets("Sheet4").Range("T4").Value = vung
Msgbox("phạm vi " & vung)
end sub
 
Và bạn đã hỏi nhiều thì phải hiểu là: với các bài có code thì nên đính kèm file, hỏi kiểu code thế này thì mọi người chỉ võ đoán đại, chệch trúng sao biết
 
Và bạn đã hỏi nhiều thì phải hiểu là: với các bài có code thì nên đính kèm file, hỏi kiểu code thế này thì mọi người chỉ võ đoán đại, chệch trúng sao biết
cảm ơn bạn. mình hỏi suốt mấy hôm thảo nào không tìm được câu trả lời, để mình gửi file cho bạn giúp mình với
 
Và bạn đã hỏi nhiều thì phải hiểu là: với các bài có code thì nên đính kèm file, hỏi kiểu code thế này thì mọi người chỉ võ đoán đại, chệch trúng sao biết
Gửi bạn file, Biểu đồ ở Sheet 3 bạn nhé
 

File đính kèm

File xlsx làm gì code mà sửa,
Rồi tại sao lại dùng subtotal?
mình đang dùng code này
Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series
Dim srs2 As Series

On Error Resume Next
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)
Set srs2 = ActiveChart.SeriesCollection(2)

Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs1.Values)
Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs2.Values)
End With

Set srs1 = Nothing
Set srs2 = Nothing
Next i
On Error Resume Next
End Sub
Bài đã được tự động gộp:

mình đang dùng code này
Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series
Dim srs2 As Series

On Error Resume Next
For i = 1 To ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)
ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)
Set srs2 = ActiveChart.SeriesCollection(2)

Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs1.Values)
Sheets("Sheet3").ChartObjects(i).Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Subtotal(105, srs2.Values)
End With

Set srs1 = Nothing
Set srs2 = Nothing
Next i
On Error Resume Next
End Sub
nhưng nó chưa giải quyết được vấn đề khi gặp những giá trị lỗi #NA ..vv
Bài đã được tự động gộp:

File xlsx làm gì code mà sửa,
Rồi tại sao lại dùng subtotal?
Mình muốn biểu đồ khi cập nhật dữ liệu vào thì nó tự động đặt tỉ lệ trục tọa độ trên biểu đồ theo giá trị nhỏ nhất
 
Không phải code gì đâu hãy làm như sau

- Ở vùng dữ liệu,
+ gõ vào 1 ô trống
=NA()
+ rồi copy ô đó dán giá trị (value) vào các vị trí #NA của vùng dữ liệu (N . A đúng là #N/A)

- Tại đồ thị hãy nháy đúp vào trục số chọn Minimize Unit là Auto

là xong
 
Không phải code gì đâu hãy làm như sau

- Ở vùng dữ liệu,
+ gõ vào 1 ô trống
=NA()
+ rồi copy ô đó dán giá trị (value) vào các vị trí #NA của vùng dữ liệu (N . A đúng là #N/A)

- Tại đồ thị hãy nháy đúp vào trục số chọn Minimize Unit là Auto

là xong
hic. có 2800 biểu đồ.. và thường xuyên cần phải cập nhật nữa. file mình gửi là mẫu thôi nên mình xóa bớt cho nhẹ chứ để nguyên nó tới 50M.
 
hic. có 2800 biểu đồ.. và thường xuyên cần phải cập nhật nữa. file mình gửi là mẫu thôi nên mình xóa bớt cho nhẹ chứ để nguyên nó tới 50M.
Thì cứ thay hết thế, #NA của bạn đang sai, làm đồ thị vẽ sai luôn (vẽ về 0), nên phải sửa #NA trước, #NA sửa tay hay code thì cứ làm thay thế là được thay thành #N/A
nếu sửa thế thì cái min kia chắc cũng tự được, lúc đó muốn chỉnh min thế nào thì tùy (Auto là 1 giải pháp tôi đề xuất, còn tùy )
 
Không phải code gì đâu hãy làm như sau

- Ở vùng dữ liệu,
+ gõ vào 1 ô trống
=NA()
+ rồi copy ô đó dán giá trị (value) vào các vị trí #NA của vùng dữ liệu (N . A đúng là #N/A)

- Tại đồ thị hãy nháy đúp vào trục số chọn Minimize Unit là Auto

là xong
nếu cần chuyển thành Auto thì 2 dòng code này là xong rồi bạn ạ

ActiveChart.Axes(xlValue, xlSecondary).MinimumScaleIsAuto = True
ActiveChart.Axes(xlValue).MinimumScaleIsAuto = True
 
Thì cứ thay hết thế, #NA của bạn đang sai, làm đồ thị vẽ sai luôn (vẽ về 0), nên phải sửa #NA trước, #NA sửa tay hay code thì cứ làm thay thế là được thay thành #N/A
nếu sửa thế thì cái min kia chắc cũng tự được, lúc đó muốn chỉnh min thế nào thì tùy (Auto là 1 giải pháp tôi đề xuất, còn tùy )
chết thật. cái #NA đó là mình nhập tay đó . vùng trên file k có dữ liệu nào bị lỗi #NA làm mình nhập tay vào để gửi cho bạn đó
 
Vậy là nhập sai còn kêu gì,
Nếu đúng chuẩn của nó, thì có chi phải thắc mắc
k bạn ơi, mình k thể dùng được hàm này Application.WorksheetFunction.Subtotal(105, srs2.Values) mình đã thử như này vẫn không được:
Application.WorksheetFunction.Subtotal(105,(IsError(srs1.Values)))
 
Min thì lúc mình cần lọc thời gian.. thì nó luôn lấy Min, mình muốn dùng Subtotal để nó tự động cập nhật tỉ lệ theo Min ( của vùng dữ liệu hiển thị )
Bài đã được tự động gộp:

Min thì lúc mình cần lọc thời gian.. thì nó luôn lấy Min, mình muốn dùng Subtotal để nó tự động cập nhật tỉ lệ theo Min ( của vùng dữ liệu hiển thị )
1584544863896.png
 
Min thì lúc mình cần lọc thời gian.. thì nó luôn lấy Min, mình muốn dùng Subtotal để nó tự động cập nhật tỉ lệ theo Min ( của vùng dữ liệu hiển thị )
Bài đã được tự động gộp:


View attachment 233584
Loằng ngoằng quá, hàm MIN() như thế này

Mã:
.Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Min(srs1.Values)
.Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Min(srs2.Values)
 
Loằng ngoằng quá, hàm MIN() như thế này

Mã:
.Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Min(srs1.Values)
.Chart.Axes(xlValue, xlSecondary).MinimumScale = Application.WorksheetFunction.Min(srs2.Values)
Cái này sẽ lấy Min toàn bộ cột dữ liệu? hay sẽ chỉ lấy Min những dữ liệu sau khi lọc theo thời gian bạn nhỉ?
 
Cái này sẽ lấy Min toàn bộ cột dữ liệu? hay sẽ chỉ lấy Min những dữ liệu sau khi lọc theo thời gian bạn nhỉ?
Lọc thời gian nào? thời gian sao
hàm SUBTOTAL(105, ...
105 thì là bỏ qua ẩn dòng, liên quan gì lọc thời gian,

SUBTOTAL( ... tham số nó chỉ làm việc với RANGE
nên việc dùng Value sẽ lỗi
 
Lọc thời gian nào? thời gian sao
hàm SUBTOTAL(105, ...
105 thì là bỏ qua ẩn dòng, liên quan gì lọc thời gian,

SUBTOTAL( ... tham số nó chỉ làm việc với RANGE
nên việc dùng Value sẽ lỗi
Oh, thật là buồn bạn ạ. hôm qua thử chạy thấy ok rồi nhưng nay mình chạy thật thì lại lỗi, tình huống mình gặp là dữ liệu dài quá 3000 hàng thì nó chạy nhưng nó lại k có làm gì ( k đổi tỉ lệ trục )
mình đã thử theo 2 hướng như này nhưng đều thất bại:
1/ chỉ để phạm vị i nhỏ mỗi lần chạy, và mỗi lần chỉ chạy với 1 trục. srs1,
2/ mình chọn ẩn các hàng đi chỉ để lại ít hàng thôi. ( k xóa mà để ẩn hàng cho biểu đồ nhẹ đi ) nhưng cũng k được. ( trừ khi phải xóa bỏ hẳn các hàng đi thì mới chạy được )
đây là code minh thử với i từ 1-2 thôi và chỉ chạy srs1 nhưng nó chạy nhưng k làm gì cả.

Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series
Sheets("sheet3").Activate

On Error Resume Next
For i = 1 To 2 'ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)

ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)

.Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Min(srs1.Values)

'ActiveChart.Axes(xlValue, xlSecondary).MinimumScaleIsAuto = True
'ActiveChart.Axes(xlValue).MinimumScaleIsAuto = True
End With
Set srs1 = Nothing
Next i
On Error GoTo 0
End Sub
 
Bỏ hết
On Error Resume Next
Thì mới biết lỗi ở đâu
Không nên sử dụng lệnh đó
 
Bỏ hết
On Error Resume Next
Thì mới biết lỗi ở đâu
Không nên sử dụng lệnh đó
Cảm ơn bạn vậy để mình thử lại, tại k phải dân lập trình nên dốt quá. hi
Bài đã được tự động gộp:

Cảm ơn bạn vậy để mình thử lại, tại k phải dân lập trình nên dốt quá. hi
nếu vậy nó báo lỗi này bạn ạ:

Code mình dùng như này:

Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series

Sheets("sheet3").Activate
For i = 78 To 80 'ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)

ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)

.Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Min(srs1.Values)

End With
Set srs1 = Nothing
Next i
End Sub

1584617798062.png
 
Cảm ơn bạn vậy để mình thử lại, tại k phải dân lập trình nên dốt quá. hi
Bài đã được tự động gộp:


nếu vậy nó báo lỗi này bạn ạ:

Code mình dùng như này:

Sub doitoadoMin()
Dim i As Integer
Dim srs1 As Series

Sheets("sheet3").Activate
For i = 78 To 80 'ActiveSheet.ChartObjects.Count
With ActiveSheet.ChartObjects(i)

ActiveSheet.ChartObjects(i).Activate
Set srs1 = ActiveChart.SeriesCollection(1)

.Chart.Axes(xlValue).MinimumScale = Application.WorksheetFunction.Min(srs1.Values)

End With
Set srs1 = Nothing
Next i
End Sub

View attachment 233643
Nhắc 1 lần nữa, code phải gắn với file mới hiểu được (nên xóa bớt biểu đồ đi, để 2 3 cái với dữ liệu ngàn dòng, ,mà bị lỗi) và post (đính kèm) lên đây.
Lỗi: phải chỉ rõ dòng nào?

Nếu không, thì tôi chỉ biết bói voi qua hình, và phí thời gian
 
Lần chỉnh sửa cuối:
Nhắc 1 lần nữa, code phải gắn với file mới hiểu được (nên xóa bớt biểu đồ đi, để 2 3 cái với dữ liệu ngàn dòng, ,mà bị lỗi) và post (đính kèm) lên đây.
Lỗi: phải chỉ rõ dòng nào?

Nếu không, thì tôi chỉ biết bói voi qua hình, và phí thời gian
Cảm ơn bạn mình đã làm được rồi ( mỗi lần chỉ cho for i = 1 to 5 ) thì nó chạy ok rồi
 

Bài viết mới nhất

Back
Top Bottom