Nhận giá trị mã mầu của một ô trong Excel ?

Liên hệ QC
Ai da... tôi làm được rồi! Như vầy đây:
PHP:
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
Kết quả chính xác, chỉ còn 1 trục trặc nhỏ là khi quét công thức trên thanh Formula và F9 thì chẳng hiểu sao vẩn chỉ nhìn thấy toàn số 0
 

File đính kèm

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

Bạn xem nhé :

PHP:
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

Thân!
 
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.
 

File đính kèm

Lần chỉnh sửa cuối:
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.

Đúng là nó giống công thức thường :

  1. Khi bạn chỉ cần lấy giá trị đầu tiên thì nó sẽ giống như công thức thường và không cần nhấn Ctrl + Shift + Enter , tuy nhiên công thức mảng sẽ vẫn phải quét hết cả mảng (chậm hơn)
  2. Bạn không thể lấy được phần tử thứ 2 trở đi nếu bạn không nhấn Ctrl + Shift + Enter
  3. ...........................
Thân!
 
Xin các cao thủ giãi thích dùm tại tạo bấm F9 trên thanh Formula thì lại chỉ nhìn thấy toàn số 0
Các công thức mãng đựoc xây dựng trên nền các công thức Excel sẳn có đâu có vậy?
 
Bạn thử nhé :

PHP:
Function GetColor(MyCell As Range) As Long
    Application.Volatile (False)
    If MyCell.Count <> 1 Then Exit Function
    GetColor = MyCell.Font.Color
End Function
Thân!

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ỉ ?
 
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é):
 

File đính kèm

Lần chỉnh sửa cuối:
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?

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 :
  1. Chọn mảng
  2. Trên thanh Formula nhập công thức : =getcolorA(. . . )
  3. Nhấn F9
  4. Bị lỗi
Em làm như trên thì nhận thông báo : Formula too long
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!
 
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é):


Mình nhấn Save As thấy vẫn bình thường mà ??? Các công thức sẽ bieens thành các giá trị của nó.

Thâ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 :
  1. Chọn mảng
  2. Trên thanh Formula nhập công thức : =getcolorA(. . . )
  3. Nhấn F9
  4. Bị lỗi
Em làm như trên thì nhận thông báo : Formula too long
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!
Bạn tải file tại bài số #21 của tôi về sẽ biết liền!
Bạn chọn 1 cell nào đó trong cột C hoặc D (tức những cell có công thức mãng).. sau đó quét công thức trên thanh Formula rồi F9 thì thấy mãng cho giá trị toàn những số 0
Tôi hoàn toàn không lý giãi được tại sao lại như vậy? Trong khi tôi nhớ Soibien có 1 bài về hàm mãng tương tự, nhưng khi bấm F9 nó có giá trị đàng hoàng mà
 
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
 
Đú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

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
 
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

Đấy là chủ ý của mình ko phải lỗi: Mình cần khi xuất ra các trường dữ liệu tận dụng kiểu phân cách dữ liệu theo dạng .CSV, nhưng sau đó cần đổi tên sang dạng .txt để dùng trong một chương trình khác để sử lý tiếp. Nếu ko làm như vậy mình sẽ phải xuất ra file .CSV sau đó lại phải đổi đuôi file bằng tay sang dạng .txt như vậy bất tiện quá.
 
Web KT

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

Back
Top Bottom