Các bạn xem giúp mình file đính kèm, vì mình ko biết diễn đạt thế nào cho dễ hiểu:
Function GetColor(MyCell As Range) As Long
Application.Volatile (False)
If MyCell.Count <> 1 Then Exit Function
GetColor = MyCell.Font.Color
End Function
Mr OkeBap cho tôi hỏi thêm: Với hàm của bạn, nếu tôi muốn nó có thể sử dụng như 1 công thức mãng (tức có thể chọn nhiều cell cùng lúc) thì phải làm thế nào?
Mong được hướng dẩn thêm
Function GetColorA(Mang As Range)
Application.Volatile (True)
Dim MyCell As Range, i As Long
Dim Temp(1 To 1000, 0)
For Each MyCell In Mang
i = i + 1
Temp(i, 0) = MyCell.Font.Color
Next
GetColorA = Temp
End Function
Bác có thể dịch nghĩa những dòng này có nghĩa là gì không, ạ?
Dim Temp(1 To 1000, 0)
Temp(i, 0)
Cảm ơn bác!
Một hàng 2 chiều sẽ thể hiện Array(hàng, cột), giống như tọa độ (x,y)Vậy ", 0" là gì vậy bác? Và có thể thay những số khác không, nếu có thì tác dụng sẽ ra sao?
Cảm ơn bác 1 lần nữa! Vì hàm mãng trong VBA thì em mù tịt rồi! Mong bác dạy bài vỡ lòng cho.
À. Còn nếu có 1 Sub bình thường khác muốn lấy giá trị thứ 5 trong mảng Temp thì viết làm sao bác?
Thân.
Câu lệnh 2 có thể thay bằng:PHP:Function GetColorA(Mang As Range) Application.Volatile (True): Dim MyCell As Range, i As Long 2 Dim Temp(1 To 1000, 0) For Each MyCell In Mang i = i + 1 Temp(i, 0) = MyCell.Font.Color Next GetColorA = Temp End Function
[B][SIZE=3][COLOR=purple]Dim Temp( 1 To Mang.Cells.Count + 9, 0)[/COLOR][/SIZE][/B]
Câu lệnh 2 có thể thay bằng:
Mã:[B][SIZE=3][COLOR=purple]Dim Temp( 1 To Mang.Cells.Count + 9, 0)[/COLOR][/SIZE][/B]
![]()
Dim Temp( 1 To Mang.Count, 0)
Nhưng tại sao không phải là:
con số 9 có ý nghĩa gì vậy bác ?PHP:Dim Temp( 1 To Mang.Count, 0)
Tôi vẩn còn thắc mắc về hàm mãng này... Gõ hàm trên cell, Ctrl + Shìtt + Enter ra kết quả không có vấn đề... Nhưng nếu tôi quét chọn công thức trên thanh Formula rồi bấm F9 thì chỉ thấy hiện toàn số 0Bác tham khảo nhé :
Thân!PHP:Function GetColorA(Mang As Range) Application.Volatile (True) Dim MyCell As Range, i As Long Dim Temp(1 To 1000, 0) For Each MyCell In Mang i = i + 1 Temp(i, 0) = MyCell.Font.Color Next GetColorA = Temp End Function
Function GetColorA(Mang As Range) Application.Volatile (True): Dim MyCell As Range, i As Long Dim Temp(1 To [COLOR=red][U]Mang.Count[/U][/COLOR], 0) For Each MyCell In Mang i = i + 1 Temp(i, 0) = MyCell.Font.Color Next GetColorA = Temp End Function
Máy bạn thì hiện số 0, còn máy mình thì không chị chạy luôn. Nó báo lỗi: "Formula is too long". Không biết bác Mr Okebab có thể chỉ thêm 1 chút không? Thân.Tôi vẩn còn thắc mắc về hàm mãng này... Gõ hàm trên cell, Ctrl + Shìtt + Enter ra kết quả không có vấn đề... Nhưng nếu tôi quét chọn công thức trên thanh Formula rồi bấm F9 thì chỉ thấy hiện toàn số 0 Sao kỳ vậy ta?
Dỉ nhiên là vậy rồi vì code của Mr OkeBab ghi rằng:Máy bạn thì hiện số 0, còn máy mình thì không chị chạy luôn. Nó báo lỗi: "Formula is too long". Không biết bác Mr Okebab có thể chỉ thêm 1 chút không?
Thân.
Có đến cả ngàn phần tử là sao F9 cho nó hiển thị được... Bạn giãm nó xuống cònDim Temp(1 To 1000, 0)
Là F9 vô tưDim Temp(1 To 20, 0)
Function GetColorA(Mang As Range)
Application.Volatile (True)
Dim MyCell As Range, i As Long, iR As Long, iC As Long
Dim Temp(1 To Mang.Rows.Count, 1 To Mang.Columns.Count)
For Each MyCell In Mang
i = i + 1
iC = ((i - 1) Mod (Mang.Columns.Count)) + 1
iR = ((i - 1) \ (Mang.Columns.Count)) + 1
Temp(iR, iC) = MyCell.Font.Color
Next
GetColorA = Temp
End Function
2> Liệu có phải ReDim lại không? Nếu có thì ReDim thế nào?Contants Expression Required
Function GetColorA(Mang As Range) Application.Volatile (True) Dim MyCell As Range, i As Long, iR As Long, iC As Long Dim Temp(1 To 20, 1 To 2) For Each MyCell In Mang i = i + 1 iC = ((i - 1) Mod (Mang.Columns.Count)) + 1 iR = ((i - 1) \ (Mang.Columns.Count)) + 1 Temp(iR, iC) = MyCell.Font.Color Next GetColorA = Temp End Function
Ah... ah... tôi hiểu rồi... đã Dim mà còn đưa biến vào trong thì e rằng không ăn nhỉChẳng hiểu sau máy cậu làm được cái này thì mình lại không làm được! Còn cái bạn không làm được thì mình làm được nhỉ!
Với code trên thì mình vẫn bị lỗi lổi ở dòng Mang.Rows.count và Mang.Columns.count. Mình sửa lại như vầy thì không thấy có vấn đề gì. Bạn xem nha!
PHP:Function GetColorA(Mang As Range) Application.Volatile (True) Dim MyCell As Range, i As Long, iR As Long, iC As Long Dim Temp(1 To 20, 1 To 2) For Each MyCell In Mang i = i + 1 iC = ((i - 1) Mod (Mang.Columns.Count)) + 1 iR = ((i - 1) \ (Mang.Columns.Count)) + 1 Temp(iR, iC) = MyCell.Font.Color Next GetColorA = Temp End Function
Vô lý quá !!!Dim Temp(1 To 1000, 1 To 255)
Function GetColorA(Mang As Range)
Application.Volatile (True)
Dim MyCell As Range, i As Long, iR As Long, iC As Long
Dim Temp()
ReDim Temp(1 To Mang.Rows.Count, 1 To Mang.Columns.Count)
For Each MyCell In Mang
i = i + 1
iC = ((i - 1) Mod (Mang.Columns.Count)) + 1
iR = ((i - 1) \ (Mang.Columns.Count)) + 1
Temp(iR, iC) = MyCell.Font.Color
Next
GetColorA = Temp
End Function
Sao em xài công thức này thì nó báo lỗi vậy!
Mã:Function GetColorA(Mang As Range) Application.Volatile (True): Dim MyCell As Range, i As Long Dim Temp(1 To [COLOR=red][U]Mang.Count[/U][/COLOR], 0) For Each MyCell In Mang i = i + 1 Temp(i, 0) = MyCell.Font.Color Next GetColorA = Temp End Function
Function GetColorA(Mang As Range)
Application.Volatile (True)
If Mang.Columns.Count > 1 Then Exit Function
Dim MyCell As Range, i As Long
Dim Temp()
ReDim Temp(Mang.Count, 0)
For Each MyCell In Mang
Temp(i, 0) = MyCell.Font.Color
i = i + 1
Next
GetColorA = Temp
End Function
Cảm ơn bác nhiều. Nhưng tình cờ em phát hiện ra công thức mảng 1 cột cũng giống như công thức bình thường thôi! Đâu cần dùng mãng đâu (Tức là quét chọn rồi nhấn Ctrl + Shift + Enter) mà nó vẫn có thể lấy giá trị rất chính xác, vậy sai do đâu và lý do tại sao vậy?
Mong bác chỉ bảo thêm!
Rất chân thành cảm ơn bác!
Thân.
Bạn thử nhé :
Thân!PHP:Function GetColor(MyCell As Range) As Long Application.Volatile (False) If MyCell.Count <> 1 Then Exit Function GetColor = MyCell.Font.Color End Function
Kết quả sẽ cho ra dạng gì vậy bạn, mà mình xuất sang dạng .CSV lại báo lỗi NAME? ở ô đó nhỉ ?
Tôi vẩn còn thắc mắc về hàm mãng này... Gõ hàm trên cell, Ctrl + Shìtt + Enter ra kết quả không có vấn đề... Nhưng nếu tôi quét chọn công thức trên thanh Formula rồi bấm F9 thì chỉ thấy hiện toàn số 0
Sao kỳ vậy ta?
Mình có xem đấy chứ, bạn xem giúp file mình gửi kèm nhé (.txt dạng CSV):
Vì mình muốn dữ liệu xuất ra dạng phân cách txt để sử lý việc khác (bạn xem Sub ExcelToCSV() trong file mình nhé):
Bạn tải file tại bài số #21 của tôi về sẽ biết liền!Tại sao lại phải nhấn F9 ??? Nhấn F9 khi nào ??
Em hình dung các bước của bác :Em làm như trên thì nhận thông báo : Formula too long
- Chọn mảng
- Trên thanh Formula nhập công thức : =getcolorA(. . . )
- Nhấn F9
- Bị lỗi
Còn nếu đó là UDF thường (không phải hàm mảng) thì sẽ cho giá trị 0
Bình thường chỉ nhấn F9 khi cần tính toán, và dĩ nhiên trong ô đã có công thức rồi. Còn đang nhập vào trong Formula, nhấn F9, thì sẽ trả về giá trị của ô đó (chứ không phải là công thức)
Tuy nhiên em cũng đã thử với các công thức của Excel thì không có lỗi, tuy nhiên đối với hàm tự tạo thì bị lỗi như trên (Em dùng O2003SP3)
Và khi đang ở chế độ Edit Cell thì bình thường VBA không hoạt động, vì vậy em nghĩ rằng lúc này Excel chỉ có thể sử dụng các hàm thuần túy của excel thôi.
Và em nghĩ rằng chắc phải có một thủ tục đăng ký gì đó để cho các UDF giống như các hàm của Bill.
Thân!
Đúng là nếu dùng lệnh Save As ... thì sẽ nhận được giá trị số bình thường. Nhưng mình muốn tự động nên sử dụng một Macro có tên là ExceltoCSV() thì lại không ra giá trị số bạn ạMình nhấn Save As thấy vẫn bình thường mà ??? Các công thức sẽ biến thành các giá trị của nó.
Thân!
Đúng là nếu dùng lệnh Save As ... thì sẽ nhận được giá trị số bình thường. Nhưng mình muốn tự động nên sử dụng một Macro có tên là ExceltoCSV() thì lại không ra giá trị số bạn ạBạn lưu ý giúp trong ExceltoCSV() mình muốn đuôi file là .txt (nếu đuôi file là .csv thì không vấn đề gì). Không biết tại sao vậy
, có thể sửa ExceltoCSV() như thế nào
Sub ExcelToTxt()
Dim MyPath As String
MyPath = "D:\"
MyFileName = ActiveSheet.Cells(4, 4)
ActiveSheet.Select
ActiveSheet.Copy
ActiveWorkbook.SaveAs _
Filename:=MyPath & MyFileName, _
FileFormat:=xlText, CreateBackup:=False ''//Sửa xlCSV thành xlText
ActiveWorkbook.Close True
End Sub
Bạn ơi, code của bạn là lưu file dưới dạng thức CSV. Muốn lưu file đưới dạng thức *.txt thỉ phải sửa lại chút!
Lỗi là ở chỗ bạn lưu file dưới dạng *.txt mà lại dùng FileFormat:=xlCSV. Bạn sửa lại code như sau:
PHP:Sub ExcelToTxt() Dim MyPath As String MyPath = "D:\" MyFileName = ActiveSheet.Cells(4, 4) ActiveSheet.Select ActiveSheet.Copy ActiveWorkbook.SaveAs _ Filename:=MyPath & MyFileName, _ FileFormat:=xlText, CreateBackup:=False ''//Sửa xlCSV thành xlText ActiveWorkbook.Close True End Sub