如何通过VBA代码设置MS Access控件的Orientation属性(RTL方向)
Access VBA 设置Notes控件为RTL(从右到左)方向的解决方法
问题根源
直接通过Me.Controls("Notes").Properties("Orientation") = 1设置无效,是因为Notes控件如果是富文本框,其Orientation属于ActiveX控件的内部属性,并非Access原生控件的Properties集合属性;如果是普通纯文本框,本身没有Orientation属性,需要通过Windows API修改窗口样式。
针对富文本框控件的解决方案
如果Notes是富文本框(需确保控件的「Text Format」属性设为「富文本」),直接通过控件的Object属性访问Orientation:
Private Sub Notes_GotFocus() ' 1代表RTL方向,0代表LTR方向 Me.Notes.Object.Orientation = 1 End Sub
针对普通纯文本框控件的解决方案
普通文本框没有原生Orientation属性,需借助Windows API修改窗口扩展样式:
' 声明API函数(64位Access需加PtrSafe) Private Declare PtrSafe Function SetWindowLongPtr Lib "user32" Alias "SetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr Private Declare PtrSafe Function GetWindowLongPtr Lib "user32" Alias "GetWindowLongPtrA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As LongPtr Private Const GWL_EXSTYLE = (-20) Private Const WS_EX_RTLREADING = &H2000 ' 文本从右到左读取 Private Const WS_EX_LAYOUTRTL = &H400000 ' 控件布局从右到左 Private Sub Notes_GotFocus() Dim exStyle As LongPtr ' 获取当前窗口扩展样式 exStyle = GetWindowLongPtr(Me.Notes.hwnd, GWL_EXSTYLE) ' 添加RTL相关样式 exStyle = exStyle Or WS_EX_RTLREADING Or WS_EX_LAYOUTRTL ' 应用新样式并刷新控件 SetWindowLongPtr Me.Notes.hwnd, GWL_EXSTYLE, exStyle Me.Notes.Refresh End Sub
补充说明
- Access对象库中没有定义Orientation对应的ac常量,直接使用数值1(RTL)或0(LTR)即可。
- 若设置后仍无效果,检查控件类型是否匹配上述场景,富文本框需确认已开启富文本格式。
内容的提问来源于stack exchange,提问作者Dr. Avri
相关产品推荐
相关产品推荐

