Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中检索Ms access表单属性_Python_Ms Access - Fatal编程技术网

在python中检索Ms access表单属性

在python中检索Ms access表单属性,python,ms-access,Python,Ms Access,我想通过python检索ms access表单维度,获取“宽度”没有问题,但“高度”不是直接属性,而是由部分节的高度组成。在VBA中,这些可以通过表单获取!fName.截面(n).高度。在python中,这是失败的。是否有人知道直接访问这些属性。使用的代码是 formNames = [] strDbName = 'D:\\Python\\workspace\\Test_MDB\\kaders.mdb' oApp = Dispatch("Access.Application") oApp.Visi

我想通过python检索ms access表单维度,获取“宽度”没有问题,但“高度”不是直接属性,而是由部分节的高度组成。在VBA中,这些可以通过表单获取!fName.截面(n).高度。在python中,这是失败的。是否有人知道直接访问这些属性。使用的代码是

formNames = []
strDbName = 'D:\\Python\\workspace\\Test_MDB\\kaders.mdb'
oApp = Dispatch("Access.Application")
oApp.Visible = True
win32api.keybd_event(0x10, 0x10, 0, 0)
oApp.OpenCurrentDatabase(strDbName)
win32api.keybd_event(0x10, 0x10, 2, 0)
print("Program start .....")
for form in oApp.CurrentProject.AllForms:
    formName = form.name                # get form name and open 
    oApp.DoCmd.OpenForm(formName, 1)    # acDesign = 1
    frm = oApp.Forms(formName)          # point to form

    print (frm.width)
    print (frm.section(0).height)
最后一行与

打印(第一节(0)高度)

文件“>”,第2行,第节

pywintypes.com_错误:(-2147352573,'找不到成员',无,无)

有什么想法吗?
谢谢,

Walter

要获取表单高度的部分,只需引用表单的命名部分,而不需要数字索引:Detail、FormHeader、PageHeader

此外,我还对代码进行了一些调整,以转换print语句中表单的维度,并将循环包装在
try/except
(与VBA的
On Error
句柄相对应)中,因为您希望始终在脚本运行后从内存中取消初始化com对象,而不考虑错误

import win32api
import win32com.client   

strDbName = 'D:\\Python\\workspace\\Test_MDB\\kaders.mdb'

oApp = win32com.client.Dispatch("Access.Application")
oApp.Visible = True
win32api.keybd_event(0x10, 0x10, 0, 0)
oApp.OpenCurrentDatabase(strDbName)
win32api.keybd_event(0x10, 0x10, 2, 0)
print("Program start .....")

try:
    for form in oApp.CurrentProject.AllForms:
        formName = form.name                # get form name and open 
        oApp.DoCmd.OpenForm(formName, 1)    # acDesign = 1
        frm = oApp.Forms(formName)          # point to form

        print (form.name)                   
        print ((frm.width)/1440)            # convert twips to inchdes (1440 twips = 1 inch)
        print ((frm.Detail.height/1440))    # convert twips to inchdes (1440 twips = 1 inch)        
        print ("-----------------------")
        oApp.DoCmd.Close(2, formName)       # closing form to remove instance (in case of subforms)

except Exception as e :
        print (e)

oApp.DoCmd.CloseDatabase                    # closing database to release from memory
oApp = None                                 # uninitializing com object

尝试使用等效的
Detail0
,或使用方括号
[0]
。通常,命名对象后的括号表示Python中的函数。感谢您的回复,但在[0]节给出错误“print(frm.section[0].height)TypeError:'method'object not subscribptable”和Detail0返回错误“raise AttributeError”(%s.%s“%(self.\u username\uu,attr))AttributeError:.Detail0“您使用的节名是对的,只是我正在尝试将大量表单读取/转换为HTML+CSS,我不能确定创建者是否更改了节的默认名称或使用了其他语言。其他访问语言给出了其他名称,因为我的是荷兰语,所以“FormHeader”变成了“Formulierkoptekst”。手动检查不是选项您是否测试代码?访问取决于当前用户的区域语言设置。因此,无论您使用何种语言,请相应地修改代码。如果试图在不同的语言机器上运行Python脚本,则使用
If
有条件地调用height行。请在你这边测试英语版和荷兰语版。进行测试时,使用了英语版的“北风”和荷兰语测试表。。标题名称如所述。。我是如何发现的:-)另外,如果有人使用自己的名称来表示某个部分,例如“my_top_line”,我在检索该部分时也会遇到同样的问题。同时,我有一个解决方法,在一个部分中找到任何控件的最低点,使用控件中的部分编号,并将其作为高度,添加一些我不理解的底部填充。Access窗体的属性中只有五个,它们都不是用户定义的:Detail、FormHeader、FormFooter、PageHeader、PageFooter。有9份报告。该脚本在所有表单的循环中打开特定表单,并检索该特定表单的宽度和详细高度。什么都不叫名字。