Hỏi về Width Properties

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Tôi mò VBA và thấy có lệnh Range(...).Width
Tôi làm thí nghiệm sau:
PHP:
Sub Test()
 Dim Rng As Range
 Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
 MsgBox Rng.Width
End Sub
Nhìn kết quả mà hỏng hiểu nó là cái gì... Chỉ biết rằng kết quả sẽ thay đổi khi độ rộng cột thay đổi... Bấm F1 thì thấy nó nói sơ sài quá, lại không có ví dụ nên cũng NGU luôn
Xin các cao thủ giải thích dùm:
- Width Properties dùng vào việc gì?
- Trong trường hợp nó đi kèm với 1 Range (Range(...).Width) thì nó thể hiện cái gì?
 
Ai biết nguồn gốc RangeWidth và cách sử dụng nó thì giới thiệu cho mọi người biết với.
Chưa biết đơn vị của nó là gì? nguồn gốc từ đâu? Nhưng theo tỉ lệ thì thấy :

1 Pixel = 7*ColumnWidths + 5 = 4/3*ObjectWidth
1 ObjectWidth = 3/4*Pixels = 21/4*ColumnWidths + 15/4
1 ColumnWidth = 1/7*Pixels - 5/7 = 4/21*ObjectWidth -15/21

1 Pixel = 4/3*RowHeights = 4/3*ObjectHeights
1 ObjectHeight = 1 RowHeight = 3/4*Pixels
1 RowHeight = 1 ObjectHeight = 3/4*Pixels


Nếu zoom bình thường ở 100% thì chiều rộng đầy màn hình là :
Với bảng tính : 975Pixels = 731ObjectWidths = 138,5ColumnWidths (nhỏ hơn so với form vì chừa lại cột bên trái chứa số thứ tự Row và cột bên phải chứa thanh trượt dọc).
Với form thì các con số là : 1024Pixels = 768ObjectWidths = 146ColumnWidths (thấy số 1024Pixels = 768ObjectWidths có ý nghĩa đấy chứ!).
Xem lại máy thì thấy độ phân giải của máy đúng là 1024x768. Từ đây, xét qua màn hình 800x600 thì thấy tỉ lệ cũng là 4:3, nhưng chiều rộng màn hình chỉ chứa được 800Pixels thôi, cho nên một form đổ đầy màn hình 1024x768 (tức là có Width1024Pixels) khi đưa vào màn hình 800:600 ắt hẳn phải bị tràn.
Sau này còn có màn hình 16:9 hoặc 16:10 (1440x900) ; cho nên tỉ lệ 4:3 khi nãy có lẽ không áp dụng đúng cho các màn hình mới này?
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi mò VBA và thấy có lệnh Range(...).Width
Tôi làm thí nghiệm sau:
PHP:
Sub Test()
 Dim Rng As Range
 Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
 MsgBox Rng.Width
End Sub
Nhìn kết quả mà hỏng hiểu nó là cái gì... Chỉ biết rằng kết quả sẽ thay đổi khi độ rộng cột thay đổi... Bấm F1 thì thấy nó nói sơ sài quá, lại không có ví dụ nên cũng NGU luôn
Xin các cao thủ giải thích dùm:
- Width Properties dùng vào việc gì?
- Trong trường hợp nó đi kèm với 1 Range (Range(...).Width) thì nó thể hiện cái gì?

Không để làm gì, a ah,
mà tại sao không dùng mà lại lôi ra hỏi nhỉ?
đôi khi không nên chăm quá

thực ra thì có thể nó thừa kế thuộc tính theo đối tượng của Ms.Excel
 
Upvote 0
Chưa biết đơn vị của nó là gì? nguồn gốc từ đâu? Nhưng theo tỉ lệ thì thấy :
1 ColumnWidth = 7*Pixels + 5 (ColumnWidth là cái tôi thường xài đây).
1 Pixel = 0,75*RangeWidths (là cái Width mà bạn vừa đề cập).
Suy ra 1 ColumnWidth = 21/4*RangeWidths + 15/4
Ai biết nguồn gốc RangeWidth và cách sử dụng nó thì giới thiệu cho mọi người biết với.
Thêm 1 cái lạ nữa:
Nếu tôi xài đoạn code
PHP:
Sub Test
 MsgBox Range("A1").Width
End Sub
Kết quả thu được = 48 (trên máy tôi với bảng tính mới chưa Format)
Nhưng nếu sửa code thành:
PHP:
Sub Test
  Range("A1").Width = 48
End Sub
thì nó báo lổi ngay!
???
Hỏng lẽ Width Properties này là Read Only?
Không để làm gì, a ah,
mà tại sao không dùng mà lại lôi ra hỏi nhỉ?
đôi khi không nên chăm quá
thực ra thì có thể nó thừa kế thuộc tính theo đối tượng của Ms.Excel
Tigertiger ơi.. Muốn dùng lắm nhưng hỏng hiểu nó là cái gì thì dùng làm sao đây?
 
Upvote 0
Sửa lại như trên là ổn bác ạ, giống như điều khiển thủ công thôi.
Ah không thầy ơi!
Tôi đang tìm hiểu về Width Properties chứ không phải ColumnWidth
Và đang không hiểu Width này là cái giống gì đây?
Quan trọng nhất là tôi không biết khi kết hợp với 1 range thì kết quả của nó thể hiện điều gì?
Thầy Hướng rành về VBA gợi ý giúp với!
 
Upvote 0
thì nó báo lổi ngay!
???
Hỏng lẽ Width Properties này là Read Only?

đúng thế, với cả thay đổi thì phải dùng

Range(<.......>).ColumnWidth

Tigertiger ơi.. Muốn dùng lắm nhưng hỏng hiểu nó là cái gì thì dùng làm sao đây?



VD áp dụng đây




Using ActiveBarcode with VBA in Excel
You can use VisualBasic for Applications (VBA) to solve many things in Excel. Here we will show you how to embed, use and delete the ActiveBarcode control with VBA:

Embedding the ActiveBarcode Control into a Sheet:
In this example a barcode control will be placed directly above a cell. Then it looks like the barcode would be inside a cell.

First we read the cells size: CurrentCell = "C3"
MyHeight = Range(CurrentCell).Height
MyWidth = Range(CurrentCell).Width
MyTop = Range(CurrentCell).Top
MyLeft = Range(CurrentCell).Left
Please note that a cell should have a minimum size so the barcode can fit into it. If the cell is too small a 'Size error' will be displayed. So we resize the height of the cell to 30 pixels: ' Enlarge the cell height to 30 pixels
Range(CurrentCell).RowHeight = 30
The following function will create the barcode control directly above the cell: ActiveSheet.OLEObjects.Add(ClassType:="BARCODE.BarcodeCtrl.1", Link:=False, _
DisplayAsIcon:=False, Width:=MyWidth , Height:=MyHeight, Top:=MyTop + 2,_
Left:=MyLeft + 4).Select
To get easy access to the control we remind the name of the control in a variable named 'MyBarcode': MyBarcode = ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Name
Now you can set the properties of the control as you like: ' set properties
ActiveSheet.OLEObjects(MyBarcode).Object.Font.Size = 8
ActiveSheet.OLEObjects(MyBarcode).Object.Type = 14 ' Code 128
ActiveSheet.OLEObjects(MyBarcode).Object.Text = Range("C3")
If you do not need the control anymore you can delete it from the sheet: ActiveSheet.OLEObjects(MyBarcode).Delete
Hint: If it's necessary that Windows process upcoming events (often named as "KeepWindowsAlive") within a macro, you can force this by using the following VBA function: DoEvents
This can be necessary, e.g. if the Control must draw itself anew.

 
Upvote 0
đúng thế, với cả thay đổi thì phải dùng

Range(<.......>).ColumnWidth





VD áp dụng đây




Using ActiveBarcode with VBA in Excel
You can use VisualBasic for Applications (VBA) to solve many things in Excel. Here we will show you how to embed, use and delete the ActiveBarcode control with VBA:

Embedding the ActiveBarcode Control into a Sheet:
In this example a barcode control will be placed directly above a cell. Then it looks like the barcode would be inside a cell.

First we read the cells size: CurrentCell = "C3"
MyHeight = Range(CurrentCell).Height
MyWidth = Range(CurrentCell).Width
MyTop = Range(CurrentCell).Top
MyLeft = Range(CurrentCell).Left
Please note that a cell should have a minimum size so the barcode can fit into it. If the cell is too small a 'Size error' will be displayed. So we resize the height of the cell to 30 pixels: ' Enlarge the cell height to 30 pixels
Range(CurrentCell).RowHeight = 30
The following function will create the barcode control directly above the cell: ActiveSheet.OLEObjects.Add(ClassType:="BARCODE.BarcodeCtrl.1", Link:=False, _
DisplayAsIcon:=False, Width:=MyWidth , Height:=MyHeight, Top:=MyTop + 2,_
Left:=MyLeft + 4).Select
To get easy access to the control we remind the name of the control in a variable named 'MyBarcode': MyBarcode = ActiveSheet.Shapes(ActiveSheet.Shapes.Count).Name
Now you can set the properties of the control as you like: ' set properties
ActiveSheet.OLEObjects(MyBarcode).Object.Font.Size = 8
ActiveSheet.OLEObjects(MyBarcode).Object.Type = 14 ' Code 128
ActiveSheet.OLEObjects(MyBarcode).Object.Text = Range("C3")
If you do not need the control anymore you can delete it from the sheet: ActiveSheet.OLEObjects(MyBarcode).Delete
Hint: If it's necessary that Windows process upcoming events (often named as "KeepWindowsAlive") within a macro, you can force this by using the following VBA function: DoEvents
This can be necessary, e.g. if the Control must draw itself anew.

Thì ra nó liên quan đến Object... nhưng nói thật tôi cũng chưa biết xài lắm!
Tigertiger có thể cho 1 file ví dụ đơn giãn được không?
 
Upvote 0
PHP:
Sub Test1()
 MsgBox Range("A1").Width
End Sub
Test Cho kết quả
attachment.php

 

File đính kèm

  • test.JPG
    test.JPG
    35.7 KB · Đọc: 200
Upvote 0
Mấy trang đó tôi có xem qua sáng giờ rồi... Riêng trang dịch thì.. vừa xem... Cười vở bụng
Nó nói rằng
Width bất động sản [Excel 2003 VBA Ngôn ngữ tham khảo ]
Width Property [Excel 2003 VBA Language Reference] Width bất động sản [Excel 2003 VBA Ngôn ngữ tham khảo]
Width tài sản như nó áp dụng cho các đối tượng sử dụng.......
...........
...........
Hiiiiiiiiiii
 
Upvote 0
Giải Treest 1 chút bác ha! Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Thì ra nó liên quan đến Object... nhưng nói thật tôi cũng chưa biết xài lắm!
Tigertiger có thể cho 1 file ví dụ đơn giãn được không?

oh, phức tạp quá, lại phải nghĩ ra nhu cầu - tự làm khó mình không

a có nhu cầu sao không đặt ra nhỉ????

Vẽ text box có kích thước bằng vùng chọn

*có thể ứng dụng cho vẽ 1 text box nằm trọn trong 1 cell)


PHP:
Public Sub Cong_Shape()
  Dim Rng As Range
  Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
  
  ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, Rng.Left, Rng.Top, Rng.Width, Rng.Height).Select
  Selection.ShapeRange.Fill.Solid
  Selection.ShapeRange.Fill.ForeColor.SchemeColor = 50
End Sub


a chế biến thêm cho nhiều vùng không liên tếp, nhiều text box hàng loạt
 
Upvote 0
oh, phức tạp quá, lại phải nghĩ ra nhu cầu - tự làm khó mình không

a có nhu cầu sao không đặt ra nhỉ????

Vẽ text box có kích thước bằng vùng chọn

*có thể ứng dụng cho vẽ 1 text box nằm trọn trong 1 cell)


PHP:
Public Sub Cong_Shape()
  Dim Rng As Range
  Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
  
  ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, Rng.Left, Rng.Top, Rng.Width, Rng.Height).Select
  Selection.ShapeRange.Fill.Solid
  Selection.ShapeRange.Fill.ForeColor.SchemeColor = 50
End Sub
a chế biến thêm cho nhiều vùng không liên tếp, nhiều text box hàng loạt
Hiểu rồi... để vài bửa nữa có dịp xài tới sẽ.. chế tiếp!
Cãm ơn Tigertiger nha
 
Upvote 0
Qua thử nghiệm, tôi có nhận xét là:
Range.Height cho kết quả là tổng chiều cao các dòng của Range
Range.Width cho kết quả là tổng chiều ngang của các cột của Range
Còn Range.RowHeight, Range.ColumnWeight chỉ cho kết quả chiều cao của 1 dòng, chiều ngang của 1 cột.

Mã:
ChieuCao= Range("A1:A10").Height
Cho kết quả là tổng chiều cao các dòng 1 > 10
Mã:
ChieuCao = Range("A1:A10").RowHeight
Báo lỗi, nó không thể cho kết quả tổng chiều cao của nhiều dòng
Nhưng:
Mã:
Range("A1:A10").RowHeight=20
Định dạng các dòng 1:10 có chiều cao=20

Nhưng không biết đơn vị của Range.Height, Range.Width là gì vì tỷ lệ kết quả của giữa nó so với Range.RowHeight và Range.ColumnWidth không giống nhau:

Thực nghiệm 1:
Mã:
 Sub RangeWidth()
For c = 2 To 11
  Cells(1, c) = Cells(1, c).ColumnWidth
  Cells(2, c) = Cells(2, c).Width
Next
Cells(2, 12) = Range("B1:K1").Width
End Sub
Cho kết quả:
Column.jpg


Dòng 1: Range.ColumnWidth
Dòng 2: Range.Width
Dòng 3: Tỷ lệ Range.Width/Range.ColumnWidth. Tỷ lệ này không bằng nhau nhưng (5,4 > 5,9) nhưng ô L2= Range("B1:K1").Width= tổng các ô B2+C2+...+K2

Thực nghiệm 2:
Mã:
 Sub RangeHeight()
For r = 1 To 10
  Cells(r, 1) = Cells(r, 1).RowHeight
  Cells(r, 2) = Cells(r, 2).Height
Next
Cells(11, 2) = Range("A1:A10").Height
End Sub
Cho kết quả:
Height.jpg


Cột A = Range.RowHeight
Cột B = Range.Height
Kết quả 2 cột gần tương đương nhau.
 
Upvote 0
Nhưng không biết đơn vị của Range.Height, Range.Width là gì vì tỷ lệ kết quả của giữa nó so với Range.RowHeight và Range.ColumnWidth không giống nhau:

.
Em cũng có nhận xét Range.Width là tổng độ rộng của Range... có điều không biết đơn vị của nó là gì... Nếu biết ta có thể quy đổi ra
Chủ đề em nêu ra xuất phát từ đây:
http://www.giaiphapexcel.com/forum/showthread.php?t=15825
Em thấy với yêu cầu của tác giã nếu dùng For thì bình thường rồi... nên đang nghĩ liệu có phép tính nào đó có thể tính TỔNG 1 lần (khỏi For) hay không?
 
Upvote 0
Xin gữi lên 2 ứng dụng về Width Properties mà tôi mày mò ra được (nhờ hướng dẩn của Tigertiger)
1> Vẽ 1 hình chủ nhật nằm lọt đúng vào trong 1 cell hoặc 1 dảy cell
PHP:
Sub RecInCell()
  Dim Cell As Range, RecName As String, W As Worksheet
  On Error Resume Next
  Set Cell = Application.InputBox(Prompt:="Chon 1 cell hoac 1 day cell bat ky", Type:=8)
  Set W = ActiveSheet
  With Cell
    W.Shapes.AddShape(1, .Left, .Top, .Width, .Height).Select
    RecName = Selection.Name
  End With
  With W.Shapes(RecName)
    .Fill.ForeColor.SchemeColor = 6
    .Line.ForeColor.SchemeColor = 6
  End With
End Sub
2> Format 1 Range với các cell là những ô vuông (chiều cao = chiều rộng)
PHP:
Sub SquareCells()
  Dim Rng As Range, Size As Double, i As Long
  On Error Resume Next
  Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
  Size = Application.InputBox(Prompt:="Go do dai vao day!", Type:=1)
  With Rng
    .ColumnWidth = Size
    .RowHeight = Rng(1).Width
    .Interior.ColorIndex = 6
    For i = 1 To 4
       .Borders(i).Weight = 1
    Next i
  End With
End Sub
- Mời các bạn (mới học như tôi) tham khảo chơi
- Các sư phụ VBA góp ý bổ sung thêm
 

File đính kèm

Upvote 0
Xin gữi lên 2 ứng dụng về Width Properties mà tôi mày mò ra được (nhờ hướng dẩn của Tigertiger)
1> Vẽ 1 hình chủ nhật nằm lọt đúng vào trong 1 cell hoặc 1 dảy cell
PHP:
Sub RecInCell()
  Dim Cell As Range, RecName As String, W As Worksheet
  On Error Resume Next
  Set Cell = Application.InputBox(Prompt:="Chon 1 cell hoac 1 day cell bat ky", Type:=8)
  Set W = ActiveSheet
  With Cell
    W.Shapes.AddShape(1, .Left, .Top, .Width, .Height).Select
    RecName = Selection.Name
  End With
  With W.Shapes(RecName)
    .Fill.ForeColor.SchemeColor = 6
    .Line.ForeColor.SchemeColor = 6
  End With
End Sub
2> Format 1 Range với các cell là những ô vuông (chiều cao = chiều rộng)
PHP:
Sub SquareCells()
  Dim Rng As Range, Size As Double, i As Long
  On Error Resume Next
  Set Rng = Application.InputBox(Prompt:="Chon vung", Type:=8)
  Size = Application.InputBox(Prompt:="Go do dai vao day!", Type:=1)
  With Rng
    .ColumnWidth = Size
    .RowHeight = Rng(1).Width
    .Interior.ColorIndex = 6
    For i = 1 To 4
       .Borders(i).Weight = 1
    Next i
  End With
End Sub
- Mời các bạn (mới học như tôi) tham khảo chơi
- Các sư phụ VBA góp ý bổ sung thêm

hồi này lên tay nhanh thật, VBA a giỏi rồi (nên nghỉ được rồi ... hix)
Thường thì nhu cầu xuất phát từ thực tế nhưng a lại tự nghĩ ra -> giỏi qua
Có câu hỏi này, a ndu giải giúp

Muốn một macro di chuyển 1 shape đang chọn về vị trí ô trên đó?
VD: góc trái trên (topleft) của shape chọn đang ở C10 muốn di chuyển sao cho topleft của shape về C9

các cao thủ giúp sức với, tks
.
 
Lần chỉnh sửa cuối:
Upvote 0
hồi này lên tay nhanh thật, VBA a giỏi rồi (nên nghỉ được rồi ... hix)
Thường thì nhu cầu xuất phát từ thực tế nhưng a lại tự nghĩ ra -> giỏi qua
Có câu hỏi này, a ndu giải giúp

Muốn một macro di chuyển 1 shape đang chọn về vị trí ô trên đó?
VD: góc trái trên (topleft) của shape chọn đang ở C10 muốn di chuyển sao cho topleft của shape về C9

các cao thủ giúp sức với, tks
.

bài này đã có VD về Combobox (Object) thay thế Validation luôn di chuyển cùng với ô được chọn rồi mà.

PHP:
Sub thaydoi()
With S01.CBViDu
        .Visible = False            ' Khong cho hien thi CB
        .Visible = True             ' Cho hien thi CB
        .Left = ActiveCell.Left     ' Lam cho CB vua voi o chon
        .Top = ActiveCell.Top       ' Lam cho CB vua voi o chon
        .Width = ActiveCell.Width   ' Lam cho CB vua voi o chon
        .Height = ActiveCell.Height ' Lam cho CB vua voi o chon
        .LinkedCell = ""            ' Bo Link toi o cu de khi CB thay doi khong lay gia tri cu
        .Value = ""                 ' Cho gia tri  CB = 0 de CB_Change khong chay
End With
End Sub
Thân!
 
Upvote 0
MoveShape

Muốn một macro di chuyển 1 shape đang chọn về vị trí ô trên đó?
VD: góc trái trên (topleft) của shape chọn đang ở C10 muốn di chuyển sao cho topleft của shape về C9 .

Macro này cần được gán vào 1 biểu tượng trên thanh công cụ thì mới thực hiện đúng với shape đang được chọn trong cửa sổ hiện thời.

PHP:
Sub MoveShape()
'Dim sha As Shape
Dim ce As Range
On Error Resume Next
    With ActiveWindow.Selection.ShapeRange(1)
      Set ce = .TopLeftCell
      .Top = ce.Offset(-1, 0).Top   ' điều chỉnh các tham số di chuyển nếu muốn
      .Left = ce.Offset(0,0).Left     ' ...
    End With
End Sub

-hvl-
 
Upvote 0
Web KT

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

Back
Top Bottom