Nhận giá trị mã mầu của một ô trong Excel ? (1 người xem)

Liên hệ QC

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

Chuotdong

Thành viên thường trực
Tham gia
28/11/06
Bài viết
255
Được thích
60
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:
 

File đính kèm

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:

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!
 
Lần chỉnh sửa cuối:
Dùng hàm GET.CELL(24) trong bộ hàm Macro 4 cũng là 1 giãi pháp hay và đơn giãn!
Tham khảo tại đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=7613
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
 
Lần chỉnh sửa cuối:
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


Bác bây giờ nghiên cứu cả hàm mảng cơ à ?? Trình độ tăng nhanh chóng mặt.

Bác tham khảo nhé :
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

Thân!
 

File đính kèm

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

1. Khai báo biến Temp là 1 mảng gồm 1 cột, với 1000 hàng, và hàng thứ nhất bắt đầu từ 1

2. Giá trị tại hàng thứ i của mảng Temp

OK rồi chứ ??

Thân!
 
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.
 
Lần chỉnh sửa cuối:
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.
Một hàng 2 chiều sẽ thể hiện Array(hàng, cột), giống như tọa độ (x,y)
Trong một mảng bình thường, thì cột đầu tiên có số thứ tự là 0, cột thứ 2 có số thứ tự là 1
Tương tự như vậy đối với hàng

Muốn lấy giá trị thứ năm :
  • Hàng thứ 5 cột thứ i : Array(4, i-1)
  • Cột thứ 5, hàng thứ i : Array(i-1, 4)
Bạn hãy tìm hiểu trên diễn đàn với từ khóa Array sẽ thấy nhiều điều bổ ích.

Thân!
 
Cảm ơn bác, em cũng đã đọc nhiều nhưng do thiếu kiến thức nền tảng nên đọc vào cũng như không? Cảm ơn bác đã giúp em có nền nhà! Vậy em có thể xây dựng từ đây, rồi! Thanks.
 
Lần chỉnh sửa cuối:
To BAB & Chúc Vui!

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
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]
:-=--=0:=\+
 
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]
:-=--=0:=\+

Vâng, em cảm ơn bác.

Nhưng tại sao không phải là :

PHP:
Dim Temp( 1 To Mang.Count, 0)

con số 9 có ý nghĩa gì vậy bác ???

Thân!
 
Nhưng tại sao không phải là:
PHP:
Dim Temp( 1 To Mang.Count, 0)
con số 9 có ý nghĩa gì vậy bác ?

Thứ nhất: Con số 9 dùng để chắc như BAB rằng mảng khai báo có đủ số phần tử để chứa những gì ta sắp bắt nó chứa!
Thứ đến: Cảm ơn BAB đã rút gọn thêm trong câu lệnh
Thứ ba: BAB xóa dùm bài này cái, nha! - Xin CẢm ơn!!
 
Bác tham khảo nhé :
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
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?
 
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
 
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?
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.
 
Lần chỉnh sửa cuối:
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.
Dỉ nhiên là vậy rồi vì code của Mr OkeBab ghi rằng:
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òn
Là F9 vô tư
 
Hỏi thêm! Tôi sửa mãng 1 chiều thành 2 chiều như sau:
Mã:
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
1> Sai chổ nào mà nó báo lổi
Contants Expression Required
2> Liệu có phải ReDim lại không? Nếu có thì ReDim thế nào?
(Trình độ "tèo" quá, nghĩ mãi không ra)
 
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
 

File đính kèm

Lần chỉnh sửa cuối:
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
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ỉ
vậy chẳng lẽ không có cách nào khai báo mãng cho vừa đủ kích thước ta cần sao?
Hiện giờ tôi đang tạm dùng:
Dim Temp(1 To 1000, 1 To 255)
Vô lý quá !!!
 
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á.
 

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

Back
Top Bottom