Tính độ rộng tông các cột hay hàng

Liên hệ QC
Thầy be09 sẽ khiến khác bạn nhầm lẩn giữa đơn vị đo lường tiêu chuẩn và tỉ lệ điều chỉnh kích thước trang tính mặc định (không bao giờ đổi).

Cái Thầy chụp kia là đơn vị để tính trong việc căn chỉnh (Lề, khổ giấy, ...), bố trí trang (xem trước trang, bố cục trang, ...), nó hỗ trợ 2 mục là View (Xem) và Page Layout (Bố trí trang).
Tôi tự học máy tính và kiến thức là do tự mò học mà có chứ không đến trường học vi tính ngày nào và cũng không có đến bằng A, vì vậy cách hiểu của tôi có thể sai lệch.
Chắc phải tìm hiểu thêm vụ này.
 
Không phải anh ạ! 8,1 inch sao be vậy ạ?
Bài đã được tự động gộp:

Theo tôi hiểu thì đơn vị tính là tùy thuộc vào cách thiết lập trong cửa sổ Options (xem hình).

View attachment 228281
Em đã để mặc định là cm anh ạ! nhưng 8,1 cm nhỏ quá vậy sao anh?
Bài đã được tự động gộp:

Thầy be09 sẽ khiến khác bạn nhầm lẩn giữa đơn vị đo lường tiêu chuẩn và tỉ lệ điều chỉnh kích thước trang tính mặc định (không bao giờ đổi).

Cái Thầy chụp kia là đơn vị để tính trong việc căn chỉnh (Lề, khổ giấy, ...), bố trí trang (xem trước trang, bố cục trang, ...), nó hỗ trợ 2 mục là View (Xem) và Page Layout (Bố trí trang).
Vậy đơn vị độ rộng cột 8,1 là đơn vị gì vậy anh HeSanbi
 
Đơn vị là Points
72 Points = 2.54 Cm
1 Points = 1/72*2.54 Cm

Cách lấy độ rộng Cột chọn:
PHP:
Selection(1,Selection.Columns.Count).Left + Selection(1,Selection.Columns.Count).Width  - Selection(1,1).Left
Cách lấy chiều cao Hàng chọn:
PHP:
Selection(Selection.Rows.Count, 1).Top + Selection(Selection.Rows.Count,1).Height - Selection(1,1).Top

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
Anh ơi, code bị lỗi khi sử dụng 02 hàm :
=SelectionWidth(D1)
=SelectionWidth(D1)
thì báo lỗi #Value!
Anh xem cho em mới ạ!
 

File đính kèm

  • Fileloi.xlsm
    16.7 KB · Đọc: 5
Độ rộng này được chuẩn hóa dựa theo tỉ lệ Font chữ
Và đơn vị điều chỉnh độ rộng này là Pica

Đơn vị độ rộng sẽ là: 1 Pica = 12 Points
Tỉ lệ chiều cao tương ứng là: 1*4/3 Points

Tất cả nên được quy về Points khi thực hiện tính toán trong VBA. Khi trả ngược giá trị thì ta nhân theo tỉ lệ tương ứng.
Nhờ bác giải thích giúp em mới!
em dùng hàm =RangeWidth() thi đo được kết quả "48"
trong khi đó độ rộng 6,33 và 64 điểm ảnh là em click vào có kết quả vậy.
Vậy để quy đổi từ 48 ra 6,33 và 64 thì cách đổi thế nào đò vậy bác?
Và khi đo tổng độ rộng của vùng nào đó em thay đổi độ rộng của vùng đó thì không thấy kết quả =RangeWidth() thay đổi theo.
cảm ơn bác!
66666.png
Bài đã được tự động gộp:

Cách khác thì xem ở sheet2 của File.
Thầy be09 có thể giúp em hàm mà tính được tổng độ rộng hoặc cao của vùng.
Không phải tính tổng thông qua hàm Sum() nữa!
Em xem thấy hàm tính độ rộng, cao của ô đơn thì rất hợp lý rồi ạ!
Cảm ơn thầy!
 
Lần chỉnh sửa cuối:
Thầy be09 có thể giúp em hàm mà tính được tổng độ rộng hoặc cao của vùng.
Không phải tính tổng thông qua hàm Sum() nữa!
Em xem thấy hàm tính độ rộng, cao của ô đơn thì rất hợp lý rồi ạ!
Cảm ơn thầy!
[/QUOTE]

Thầy chắc đang bận rồi, mình đang rảnh viết đại bạn thử nhé.

Mã:
Sub TinhChieuCao()
    Dim i, Lr, ChCao, Total As Integer
    Lr = Sheet2.Range("B" & Rows.Count).End(xlUp).Row
    
    With Sheet2
        For i = 2 To Lr
            ChCao = .Range("B" & i).EntireRow.Height
            Total = Total + ChCao
        Next i
    End With
    MsgBox "Tong chieu cao la: " & Total
End Sub
 

File đính kèm

  • Fileloi1.xlsm
    22.4 KB · Đọc: 4
Lần chỉnh sửa cuối:
Anh ơi, code bị lỗi khi sử dụng 02 hàm :
Bạn copy bị thiếu một phần Code để vào Worksheet chứa cell có các hàm đó

Và vận dụng hàm bị sai.

Đúng sẽ là:
=SelectionWidth()
=SelectionHeight()
----------------------------------
=RangeWidth(A1) hoặc =RangeWidth(A1:C5)
=RangeHeight(A1) hoặc =RangeHeight(A1:C5)

-----------------------------------------------
Nhờ bác giải thích giúp em mới!
em dùng hàm =RangeWidth() thi đo được kết quả "48"
trong khi đó độ rộng 6,33 và 64 điểm ảnh là em click vào có kết quả vậy.
Vậy để quy đổi từ 48 ra 6,33 và 64 thì cách đổi thế nào đò vậy bác?
Bạn đọc lại các bài tôi đã đăng, có nói đến các đơn vị tính trong một Cell

Chỉ cần vận dụng lại và tính toán thôi.
Tính toán mà bạn chưa tính được thì sao có thể sử dụng các hàm Excel đây?
 
Anh ơi cho em hỏi đơn vị mặc định độ rông cột (khi xác định độ rộng cột) trong excel là đơn vị gì vây anh?
Như hình em đăng dưới đây độ rộng cột là 8,11, thì đơn vị của nó là gì vậy anh?
Em nghĩ không phải pt, không phải px.
View attachment 228274
Bạn nhớ rằng đơn vị đo bề ngang (độ rộng cột) và bề cao (chiều cao) trong excel hoàn toàn khác nhau
Bạn có thể đo thực tế luôn nhé!
Và nữa là Đơn vị đo bề rông cột được định nghĩa như sau : 10,33 x (đơn vị bề rộng cột) = 2,54 cm bạn nhé!
Do đó bề rộng cột mặc định không phải là Picas (pc) bạn nhé! có nhiều người nhầm. bạn lưu ý!
Tiếp theo nói đến chiều cao: thì đơn vị chiều cao mặc định excel là pt (Point).
Nên kết luận là:
Đơn vị mặc định đo bề rộng cột trong excel là: Đơn vị đo chiều rộng cột, nó được tính là: 1 đơn vị đo bề rộng cột = 2,54cm/10.33
Đơn vị mặc định đo chiều cao dòng là Pt.
Còn cách đổi từ pt, cm, pc, px, inc...Bạn tham khảo trên mạng nhé!
Thân!
 
Lần chỉnh sửa cuối:
Bạn copy bị thiếu một phần Code để vào Worksheet chứa cell có các hàm đó

Và vận dụng hàm bị sai.

Đúng sẽ là:
=SelectionWidth()
=SelectionHeight()
----------------------------------
=RangeWidth(A1) hoặc =RangeWidth(A1:C5)
=RangeHeight(A1) hoặc =RangeHeight(A1:C5)

-----------------------------------------------

Bạn đọc lại các bài tôi đã đăng, có nói đến các đơn vị tính trong một Cell

Chỉ cần vận dụng lại và tính toán thôi.
Tính toán mà bạn chưa tính được thì sao có thể sử dụng các hàm Excel đây?
Xin cảm ơn anh!
 
Bạn nhớ rằng đơn vị đo bề ngang (độ rộng cột) và bề cao (chiều cao) trong excel hoàn toàn khác nhau
Bạn có thể đo thực tế luôn nhé!
Và nữa là Đơn vị đo bề rông cột được định nghĩa như sau : 13 x (đơn vị bề rộng cột) = 2,54 cm bạn nhé!
Do đó bề rộng cột mặc định không phải là Picas (pc) bạn nhé! có nhiều người nhầm. bạn lưu ý!
Tiếp theo nói đến chiều cao: thì đơn vị chiều cao mặc định excel là pt (Point).
Nên kết luận là:
Đơn vị mặc định đo bề rộng cột trong excel là: Đơn vị đo chiều rộng cột, nó được tính là: 1 đơn vị đo bề rộng cột = 2,54cm/13
Đơn vị mặc định đo chiều cao dòng là Pt.
Còn cách đổi từ pt, cm, pc, px, inc...Bạn tham khảo trên mạng nhé!
Thân!
Ai đã nói "bề rộng cột mặc định là Picas" vậy bạn?

Pica là đơn vị dùng để căn chỉnh độ rộng cột bạn nhé.

Chuột phải vào Cột -> Chọn Column Width... Sẽ rõ.

Ở trên người ta hỏi "8,11 là gì vậy?" Thì tôi đã trả lời rằng:

Trích dẫn #18 : "Và đơn vị điều chỉnh độ rộng này là Pica"

Đơn vị độ rộng để tính toán của cột trong VBA chắc chắn 100% là Points
 
Lần chỉnh sửa cuối:
Độ rộng này được chuẩn hóa dựa theo tỉ lệ Font chữ
Và đơn vị điều chỉnh độ rộng này là Pica

Đơn vị độ rộng sẽ là: 1 Pica = 12 Points
Tỉ lệ chiều cao tương ứng là: 1*4/3 Points

Tất cả nên được quy về Points khi thực hiện tính toán trong VBA. Khi trả ngược giá trị thì ta nhân theo tỉ lệ tương ứng.
Vâng, vậy như hình em đo bề rộng cột là 11,67 như hình sau, thì đơn vị của 11,67 là gì anh?
Cái hàm mặc định anh viết giúp thì nó đơn vị là pt rồi, em sử dụng để đo cột mà có kết quả là 11,67 thì đo bằng hàm =RangeWidth(D2) anh giúp
sẽ có kết quả là 84 thì em hiểu là 84pt.
Nhưng cái 11,67 trên em không hiểu đơn vị là gì, nó không phải picas, không phải px
 
Ai đã nói "bề rộng cột mặc định là Picas" vậy bạn?

Pica là đơn vị dùng để căn chỉnh độ rộng cột bạn nhé.

Chuột phải vào Cột -> Chọn Column Width... Sẽ rõ.

Ở trên người ta hỏi "8,11 là gì vậy?" Thì tôi đã trả lời rằng:

Trích dẫn #18 : "Và đơn vị điều chỉnh độ rộng này là Pica"

Đơn vị độ rộng để tính toán của cột trong VBA chắc chắn 100% là Points
Đơn vị độ rộng để tính toán của cột trong VBA chắc chắn 100% là Points mình đồng ý!
Nhưng Pica là đơn vị để căn chỉnh độ rộng cột vấn đề này hình như chưa đúng, bạn thử thực tế xem.
Chiều cao cột thì là pt để căn chỉnh chiều cao rồi!
 
Ai đã nói "bề rộng cột mặc định là Picas" vậy bạn?

Pica là đơn vị dùng để căn chỉnh độ rộng cột bạn nhé.

Chuột phải vào Cột -> Chọn Column Width... Sẽ rõ.

Ở trên người ta hỏi "8,11 là gì vậy?" Thì tôi đã trả lời rằng:

Trích dẫn #18 : "Và đơn vị điều chỉnh độ rộng này là Pica"

Đơn vị độ rộng để tính toán của cột trong VBA chắc chắn 100% là Points
hic, em nhờ anh giúp em: bài toán
làm sao để chiều rộng cột J1 = tổng chiều rộng từ cột B1: H1
Em không biết lấy cách nào để nó tuyệt đối bằng nhau được.
Anh giúp em mới ạ!
bt.png
 
Vâng, vậy như hình em đo bề rộng cột là 11,67 như hình sau, thì đơn vị của 11,67 là gì anh?
Cái hàm mặc định anh viết giúp thì nó đơn vị là pt rồi, em sử dụng để đo cột mà có kết quả là 11,67 thì đo bằng hàm =RangeWidth(D2) anh giúp
sẽ có kết quả là 84 thì em hiểu là 84pt.
Nhưng cái 11,67 trên em không hiểu đơn vị là gì, nó không phải picas, không phải px
Đơn vị độ rộng để tính toán của cột trong VBA chắc chắn 100% là Points mình đồng ý!
Nhưng Pica là đơn vị để căn chỉnh độ rộng cột vấn đề này hình như chưa đúng, bạn thử thực tế xem.
Chiều cao cột thì là pt để căn chỉnh chiều cao rồi!
Chẳng nhẽ tôi phải viết cả một bài viết để giải thích cho các bạn đây.

Cột mà khi bạn thực hiện Giãn cột: có hai thông số

Ví dụ: Cột A có thông số độ rộng là 6,33 và 64

Thì:
1. Thông số 6,33 đơn vị là Pica
2. Thông số 64 là đơn vị Pixels

Đơn vị tính trong VBA:
Range("A1").Width = 48 đơn vị là Points
hoặc Columns("A").Width = 48

Đối với Hàng:
1. Thông số 16.50 đơn vị là Points
2. Thông số 22.0 là đơn vị Pixels


Rows(1).Height = 16.50 đơn vị vẫn là Points


Để đổi đơn vị Points -> Pixels hoặc ngược lại các bạn cần sử dụng WinAPI để lấy thông số cơ sở của Window


Các bạn còn thắc mắc gì nữa không tôi giải thích luôn thể.
Bài đã được tự động gộp:

hic, em nhờ anh giúp em: bài toán
làm sao để chiều rộng cột J1 = tổng chiều rộng từ cột B1: H1
Em không biết lấy cách nào để nó tuyệt đối bằng nhau được.
Anh giúp em mới ạ!
Tôi đã có hướng dẫn ở #8 rồi
 
Lần chỉnh sửa cuối:
Chẳng nhẽ tôi phải viết cả một bài viết để giải thích cho các bạn đây.

Cột mà khi bạn thực hiện Giãn cột: có hai thông số

Ví dụ: Cột A có thông số độ rộng là 6,33 và 64

Thì:
1. Thông số 6,33 đơn vị là Pica
2. Thông số 64 là đơn vị Pixels

Đơn vị tính trong VBA:
Range("A1").Width = 48 đơn vị là Points
hoặc Columns("A").Width = 48



Để đổi đơn vị Points -> Pixels hoặc ngược lại các bạn cần sử dụng WinAPI để lấy thông số cơ sở của Window


Các bạn còn thắc mắc gì nữa không tôi giải thích luôn thể.
Bài đã được tự động gộp:


Tôi đã có hướng dẫn ở #8 rồi

Columns("J").ColumnWidth = RangeWidth([B1: H1])
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?
 
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?
Bạn sang bài viết này đọc từ #34

Cách lấy:
JavaScript:
#If VBA7 Then
  Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
  Private Declare PtrSafe Function GetDeviceCaps Lib "gdi32" (ByVal hDC As LongPtr, ByVal nIndex As Long) As Long
  Private Declare PtrSafe Function ReleaseDC Lib "user32" (ByVal hwnd As LongPtr, ByVal hDC As LongPtr) As Long
#Else
  Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hDC As Long, ByVal nIndex As Long) As Long
  Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hDC As Long) As Long
#End If
Public PixelsPerX!, PixelsPerY!, PointsPerX!, PointsPerY!
Sub GetPerPointsAndPerPixels()
  If PixelsPerX <> 0 Then Exit Sub
  Const POINTSPERINCH = 72, LOGPIXELSX = 88, LOGPIXELSY = 90
  #If VBA7 Then
    Dim hDC^, SngX!, SngY!
  #Else
    Dim hDC&, SngX!, SngY!
  #End If
  hDC = GetDC(0)
  SngX = GetDeviceCaps(hDC, LOGPIXELSX): SngY = GetDeviceCaps(hDC, LOGPIXELSY)
  PixelsPerX = SngX / POINTSPERINCH: PixelsPerY = SngY / POINTSPERINCH 'Pixels = POINTS * PixelsPer
  PointsPerX = POINTSPERINCH / SngX: PointsPerY = POINTSPERINCH / SngY 'Points = PIXELS * PointsPer
  ReleaseDC 0, hDC
End Sub

'Sửa lại hàm sau:
'Với đối số IsPoints = True thì hàm trả về giá trị với đơn vị Points
'Với đối số IsPoints = False thì hàm trả về giá trị với đơn vị Pica
'Phương thức [A1].EntireColumn.ColumnWidth nhận giá trị phải là Pica
'1 Pica = 12 Point - Phụ thuộc thông số window mà giá trị này thay đổi
'Ví dụ: 
'Trong giãn Cột: 1 Pica = 16 Pixel
'nhưng: 10 Pica = 97 Pixel,  100 Pica = 907 Pixel

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
 
Lần chỉnh sửa cuối:
Chẳng nhẽ tôi phải viết cả một bài viết để giải thích cho các bạn đây.

Cột mà khi bạn thực hiện Giãn cột: có hai thông số

Ví dụ: Cột A có thông số độ rộng là 6,33 và 64

Thì:
1. Thông số 6,33 đơn vị là Pica
2. Thông số 64 là đơn vị Pixels

Đơn vị tính trong VBA:
Range("A1").Width = 48 đơn vị là Points
hoặc Columns("A").Width = 48

Đối với Hàng:
1. Thông số 16.50 đơn vị là Points
2. Thông số 22.0 là đơn vị Pixels


Rows(1).Height = 16.50 đơn vị vẫn là Points


Để đổi đơn vị Points -> Pixels hoặc ngược lại các bạn cần sử dụng WinAPI để lấy thông số cơ sở của Window


Các bạn còn thắc mắc gì nữa không tôi giải thích luôn thể.
Bài đã được tự động gộp:


Tôi đã có hướng dẫn ở #8 rồi
Cột A em đo được bề rộng là 48 points em muốn chuyển đổi về đơn vị.
1 Pica = 12 Points vậy Bề rộng tương ứng với 48pt tính theo pica sẽ là 48/12=4 pica
Nhưng đo độ rông cột bằng cách click chuột phải chọn Column Width sẽ là 6,33.
Nguyên nhân do đâu vậy anh?
Cám ơn anh!
 
Lần chỉnh sửa cuối:
Cột A em đo được bề rộng là 48 points em muốn chuyển đổi về đơn vị.
1 Pica = 12 Points vậy Bề rộng tương ứng với 48pt tính theo pica sẽ là 48/12=4 pica
Nhưng đo độ rông cột bằng cách click chuột phải chọn Column Width sẽ là 6,33.
Nguyên nhân do đâu vậy anh?
Cám ơn anh!
Bạn thử thực hiện thế này xem sao:
---------
PHP:
Public Sub Test()
  Dim Tmp!, TiLe!, Characters!, 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
  '---------------------------------'
  Characters = 10
  Points = (Characters - 1) * TiLe + 9
  Characters = (Points - 9) / TiLe + 1
  Debug.Print TiLe, Points, Characters
  Points = [A1:C1].EntireColumn.Width
  [D1].EntireColumn.ColumnWidth = (Points - 9) / TiLe + 1
End Sub
 
Bạn thử thực hiện thế này xem sao:
---------
PHP:
Public Sub Test()
  Dim Tmp!, TiLe!, Characters!, 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
  '---------------------------------'
  Characters = 10
  Points = (Characters - 1) * TiLe + 9
  Characters = (Points - 9) / TiLe + 1
  Debug.Print TiLe, Points, Characters
  Points = [A1:C1].EntireColumn.Width
  [D1].EntireColumn.ColumnWidth = (Points - 9) / TiLe + 1
End Sub
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!
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom