Cám ơn anh, anh cho em hỏi:
Cách sử dụng sao ạ?
Vùng [A1:C1] mình đo được đơn vị là pt
Thì chạy code ở ô D1 là picas đúng không ạ?
Nhưng em chạy code thấy không hiện dữ liệu ạ!
Cảm ơn anh!
Không biết các bạn định vận dụng vấn đề gì.
Code này chỉ là code tạm, chứ ngâm cứu kỉ rất mất thời gian, và công sức.
PHP:
Public Sub TestArea()
' Height Point'
[A1] = RangeHeight([A1:D10], True)
' Height Character'
[A2] = RangeHeight([A1:D10], False)
' Width Point'
[A3] = RangeWidth([A1:D10], True)
' Width Character'
[A4] = RangeWidth([A1:D10], False)
'[A5:A15].EntireRow.RowHeight = 100 / [A5:A15].Rows.Count'
'[E1:F1].EntireColumn.ColumnWidth = 100 / [E1:F1].Columns.Count'
'Không thể áp dụng trực tiếp hàm vào Cell excel'
End Sub
Private Function RangeHeight!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
RangeHeight = Rng.EntireColumn.Width
If Not IsPoints Then
RangeHeight = PointToCharacter(RangeHeight)
End If
End Function
Public Function RangeWidth!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
If IsPoints Then
RangeWidth = Rng.EntireColumn.Width
Else
Dim I&
For I = 1 To Rng.Columns.Count
RangeWidth = RangeWidth + Rng(1, I).EntireColumn.ColumnWidth
Next I
End If
End Function
Private Function CharacterToPoint(ByVal Characters!)
If VBA.Abs(Characters) - 1 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Points!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
CharacterToPoint = (VBA.Abs(Characters) - 1) * TiLe + 9
End Function
Private Function PointToCharacter(ByVal Points!)
If VBA.Abs(Points) - 9 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Characters!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
PointToCharacter = (VBA.Abs(Points) - 9) / TiLe + 1
End Function
Không biết các bạn định vận dụng vấn đề gì.
Code này chỉ là code tạm, chứ ngâm cứu kỉ rất mất thời gian, và công sức.
PHP:
Public Sub TestArea()
' Height Point'
[A1] = RangeHeight([A1:D10], True)
' Height Character'
[A2] = RangeHeight([A1:D10], False)
' Width Point'
[A3] = RangeWidth([A1:D10], True)
' Width Character'
[A4] = RangeWidth([A1:D10], False)
'[A5:A15].EntireRow.RowHeight = 100 / [A5:A15].Rows.Count'
'[E1:F1].EntireColumn.ColumnWidth = 100 / [E1:F1].Columns.Count'
'Không thể áp dụng trực tiếp hàm vào Cell excel'
End Sub
Private Function RangeHeight!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
RangeHeight = Rng.EntireColumn.Width
If Not IsPoints Then
RangeHeight = PointToCharacter(RangeHeight)
End If
End Function
Public Function RangeWidth!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
If IsPoints Then
RangeWidth = Rng.EntireColumn.Width
Else
Dim I&
For I = 1 To Rng.Columns.Count
RangeWidth = RangeWidth + Rng(1, I).EntireColumn.ColumnWidth
Next I
End If
End Function
Private Function CharacterToPoint(ByVal Characters!)
If VBA.Abs(Characters) - 1 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Points!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
CharacterToPoint = (VBA.Abs(Characters) - 1) * TiLe + 9
End Function
Private Function PointToCharacter(ByVal Points!)
If VBA.Abs(Points) - 9 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Characters!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
PointToCharacter = (VBA.Abs(Points) - 9) / TiLe + 1
End Function
Em có áp dụng hàm để tính độ rộng cột và độ cao hàng của anh giúp trên!
Sau khi ra độ rộng của hàng của một vùng nào đó C1:C10, độ rộng tính bằng pt được điền kết quả vào ô D1, giờ em muốn đổi dữ liệu ô D1 từ đơn vị pt ra pica và điền kết quả tính ra pica vào ô nào đó do mình chọn.
Anh có nói "Code này chỉ là code tạm" là sao ạ? vận dụng code anh giúp trên thế nào vào trường hợp em nêu trong bài này ạ!
Cảm ơn anh nhiều!
Không biết các bạn định vận dụng vấn đề gì.
Code này chỉ là code tạm, chứ ngâm cứu kỉ rất mất thời gian, và công sức.
PHP:
Public Sub TestArea()
' Height Point'
[A1] = RangeHeight([A1:D10], True)
' Height Character'
[A2] = RangeHeight([A1:D10], False)
' Width Point'
[A3] = RangeWidth([A1:D10], True)
' Width Character'
[A4] = RangeWidth([A1:D10], False)
'[A5:A15].EntireRow.RowHeight = 100 / [A5:A15].Rows.Count'
'[E1:F1].EntireColumn.ColumnWidth = 100 / [E1:F1].Columns.Count'
'Không thể áp dụng trực tiếp hàm vào Cell excel'
End Sub
Private Function RangeHeight!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
RangeHeight = Rng.EntireColumn.Width
If Not IsPoints Then
RangeHeight = PointToCharacter(RangeHeight)
End If
End Function
Public Function RangeWidth!(ByVal Rng As Range, Optional ByVal IsPoints As Boolean = True)
If IsPoints Then
RangeWidth = Rng.EntireColumn.Width
Else
Dim I&
For I = 1 To Rng.Columns.Count
RangeWidth = RangeWidth + Rng(1, I).EntireColumn.ColumnWidth
Next I
End If
End Function
Private Function CharacterToPoint(ByVal Characters!)
If VBA.Abs(Characters) - 1 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Points!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
CharacterToPoint = (VBA.Abs(Characters) - 1) * TiLe + 9
End Function
Private Function PointToCharacter(ByVal Points!)
If VBA.Abs(Points) - 9 <= 0 Then Exit Function
Dim Tmp!, TiLe!, Characters!
'---------------------------------'
Application.ScreenUpdating = False
Tmp = Columns(1).ColumnWidth
Columns(1).ColumnWidth = 10
TiLe = Columns(1).Width / 9 - 1
Columns(1).ColumnWidth = Tmp
Application.ScreenUpdating = True
'---------------------------------'
PointToCharacter = (VBA.Abs(Points) - 9) / TiLe + 1
End Function
Mình không nghĩ nó phức tạp vậy!
Cảm ơn bạn, nhờ bạn mà mình đã hiểu rõ hơn!
Nếu có thời gian bạn giúp cách quy đổi ra đơn vị pica từ pt mới nhé!
Mình cũng đang rất cần.
Em có áp dụng hàm để tính độ rộng cột và độ cao hàng của anh giúp trên!
Sau khi ra độ rộng của hàng của một vùng nào đó C1:C10, độ rộng tính bằng pt được điền kết quả vào ô D1, giờ em muốn đổi dữ liệu ô D1 từ đơn vị pt ra pica và điền kết quả tính ra pica vào ô nào đó do mình chọn.
Anh có nói "Code này chỉ là code tạm" là sao ạ? vận dụng code anh giúp trên thế nào vào trường hợp em nêu trong bài này ạ!
Cảm ơn anh nhiều!
Tôi không thể hỗ trợ bạn được thêm nữa vì vấn đề này là vấn đề chuyên sâu.
Bạn cần phải biết VBA.
"Code này chỉ là code tạm"
Vì khi lấy tỉ lệ Phông chữ tôi đã mượn giá trị độ rộng 10 của cột để tính, mà không dùng kĩ thuật hay giải thuật.
Bạn phải lấy tỉ lệ độ rộng này từ trong Font ở System Window bằng các hàm API, nhưng bạn không biết VBA làm sao làm đây.
Vì sao cần làm như vậy, vì nếu Sheet được định dạng ở Dạng phông và kích thước khác nhau thì tỉ lệ sẽ thay đổi theo phông.
-------------------------------------------
Trừ khi Trang tính của bạn Luôn luôn được định dạng ở một Font cố định
Ví dụ: Phông .VNArial và Size là 10 thì tỉ lệ này sẽ bằng 5.25, có rất nhiều phông có tỉ lệ này.
Nếu như vậy Trên hàm tôi viết ở trên bạn chỉ cần thay TiLe = 5.25, và xóa những dòng trong '-------------' đi.
Tôi không thể hỗ trợ bạn được thêm nữa vì vấn đề này là vấn đề chuyên sâu.
Bạn cần phải biết VBA.
"Code này chỉ là code tạm"
Vì khi lấy tỉ lệ Phông chữ tôi đã mượn giá trị độ rộng 10 của cột để tính, mà không dùng kĩ thuật hay giải thuật.
Bạn phải lấy tỉ lệ độ rộng này từ trong Font ở System Window bằng các hàm API, nhưng bạn không biết VBA làm sao làm đây.
Vì sao cần làm như vậy, vì nếu Sheet được định dạng ở Dạng phông và kích thước khác nhau thì tỉ lệ sẽ thay đổi theo phông.
-------------------------------------------
Trừ khi Trang tính của bạn Luôn luôn được định dạng ở một Font cố định
Ví dụ: Phông .VNArial và Size là 10 thì tỉ lệ này sẽ bằng 5.25, có rất nhiều phông có tỉ lệ này.
Nếu như vậy Trên hàm tôi viết ở trên bạn chỉ cần thay TiLe = 5.25, và xóa những dòng trong '-------------' đi.
Dạ! cám ơn anh, phiền anh thêm chút xíu ạ!
Nhờ anh giúp duy nhất một lần nữa:
Anh có thể cho em xin thêm 2 trường hợp là Phông phổ thông để soạn thảo văn bản "Times new Roman" cỡ chữ là 13 và 14 thì đoạn code hoàn thiện để quy đổi đơn vị từ pt ra pica được không ạ?
Dạ! cám ơn anh, phiền anh thêm chút xíu ạ!
Nhờ anh giúp duy nhất một lần nữa:
Anh có thể cho em xin thêm 2 trường hợp là Phông phổ thông để soạn thảo văn bản "Times new Roman" cỡ chữ là 13 và 14 thì đoạn code hoàn thiện để quy đổi đơn vị từ pt ra pica được không ạ?
Em cứ tính bằng máy tính nên nó cứ lệch anh ạ! Không ra được một số gọi là hệ số tỷ lệ!
"sử dụng WinAPI để lấy thông số cơ sở của Window" là thế nào vậy anh?
Cách lấy độ rộng và chiều cao đã xác định:
Set RNG = [B4:C25]
Thay thế toàn bộ Selection thành RNG
Hàm (Tạo một Module và copy code dưới vào):
PHP:
Public RSelection As Range
Function SelectionWidth() As Long
Application.Volatile
Dim Rng As Range
If Not RSelection Is Nothing Then
Set Rng = RSelection
SelectionWidth = Rng(1, Rng.Columns.Count).Left + Rng(1, Rng.Columns.Count).Width - Rng(1, 1).Left
End If
End Function
Function SelectionHeight() As Long
Application.Volatile
Dim Rng As Range
If Not RSelection Is Nothing Then
Set Rng = RSelection
SelectionHeight = Rng(Rng.Rows.Count, 1).Top + Rng(Rng.Rows.Count, 1).Height - Rng(1, 1).Top
End If
End Function
Function RangeWidth(Optional ByVal Rng As Range) As Long
Application.Volatile
If Rng Is Nothing Then Set Rng = RSelection
If Rng Is Nothing Then Exit Function
RangeWidth = Rng(1, Rng.Columns.Count).Left + Rng(1, Rng.Columns.Count).Width - Rng(1, 1).Left
End Function
Function RangeHeight(Optional ByVal Rng As Range) As Long
Application.Volatile
If Rng Is Nothing Then Set Rng = RSelection
If Rng Is Nothing Then Exit Function
RangeHeight = Rng(Rng.Rows.Count, 1).Top + Rng(Rng.Rows.Count, 1).Height - Rng(1, 1).Top
End Function
Copy đoạn này vào Code Worksheet đang thực hiện:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Set RSelection = Target
Application.Calculate
End Sub
Em đã Thay thế toàn bộ Selection thành RNG
và được code trong module:
Mã:
Public RRNG As Range
Function RNGWidth() As Long
Application.Volatile
Dim Rng As Range
If Not RRNG Is Nothing Then
Set Rng = RRNG
RNGWidth = Rng(1, Rng.Columns.Count).Left + Rng(1, Rng.Columns.Count).Width - Rng(1, 1).Left
End If
End Function
Function RNGHeight() As Long
Application.Volatile
Dim Rng As Range
If Not RRNG Is Nothing Then
Set Rng = RRNG
RNGHeight = Rng(Rng.Rows.Count, 1).Top + Rng(Rng.Rows.Count, 1).Height - Rng(1, 1).Top
End If
End Function
Function RangeWidth(Optional ByVal Rng As Range) As Long
Application.Volatile
If Rng Is Nothing Then Set Rng = RRNG
If Rng Is Nothing Then Exit Function
RangeWidth = Rng(1, Rng.Columns.Count).Left + Rng(1, Rng.Columns.Count).Width - Rng(1, 1).Left
End Function
Function RangeHeight(Optional ByVal Rng As Range) As Long
Application.Volatile
If Rng Is Nothing Then Set Rng = RRNG
If Rng Is Nothing Then Exit Function
RangeHeight = Rng(Rng.Rows.Count, 1).Top + Rng(Rng.Rows.Count, 1).Height - Rng(1, 1).Top
End Function
Code trong sheet:
Mã:
Private Sub Worksheet_RNGChange(ByVal Target As Range)
Set RRNG = Target
Application.Calculate
End Sub
Set RNG = [B4:C25] để lấy chiều cao là sao vậy anh?
nhờ anh chỉ bảo em thêm chút để em có thể lấy được chiểu cao của một cột theo ý muốn.
Cảm ơn anh!
Mình đã làm như #8 không có được, hay mình làm lỗi ở đoạn nào, nhờ bạn HeSanbicụ thể hơn giúp mình để mình làm được xác định độ rộng cột nào đó bằng tổng độ rộng các cột chọn