programing

사무실에서 ActiveX 개체의 크기가 자동으로 변경되지 않도록 하는 방법은 무엇입니까?

easyjava 2023. 9. 6. 23:06
반응형

사무실에서 ActiveX 개체의 크기가 자동으로 변경되지 않도록 하는 방법은 무엇입니까?

이 스레드에서는 Excel 스프레드시트의 ActiveX 개체에 대한 문제를 설명합니다.그것은 끝까지 읽기에는 엉망이고 결국에는 응집력 있는 답을 얻지 못합니다.

문제는 100% 재현 가능합니다.

  1. 도킹 스테이션을 사용하는 동안 스프레드시트의 ActiveX 개체가 있는 워크북 열기
  2. 기계를 도킹 스테이션에서 분리하여 해상도 변경을 유발합니다(다른 원인도 있습니다. 저도 도킹 스테이션에 있습니다. 해상도 변경이 원인인 것 같습니다.)
  3. ActiveX 컨트롤을 클릭하면 즉시 크기가 조정되고 글꼴 크기가 변경됩니다.꼴기의가다은..Font.Size가 발생한 후 크기시키는 것 에는 변경할 수 없는 것.

권한이 있어 보이는 유일한 해결책은 MS 패치(몇 년 전에는 "핫픽스"였기 때문에 완전한 배포에는 실용적이지 않은 것 같습니다)와 레지스트리 편집을 포함하고 있는데, 이는 제가 사용하는 경우에는 실용적이지 않습니다.

저는 다음 중 하나를 위한 방법을 찾고 있습니다.

  1. 이러한 변경이 발생하지 않도록 방지
  2. 최적의 작업 찾기

온라인상에서 이 문제에 대한 권위 있는 정보가 부족합니다.저는 제 작품을 게시하려고 하지만, 그것은 심지어 이상적인 것도 아니고 더 나은 해결책을 원합니다.

제가 해결할 수 있는 방법은 시트의 모든 OLE 객체를 프로그래밍 방식으로 반복하고 디버거에 코드를 기록한 다음, 이 문제가 발생하는 이유에 대한 지침과 함께 기본적으로 시트에 "개체 크기 조정" 버튼을 포함하는 것입니다.

이 방법을 사용하면 해당 버튼을 구동할 코드가 생성됩니다.

그러나 자동으로 업데이트되지는 않습니다. 스냅샷이므로 앱을 배포하기 직전에만 사용해야 합니다(최종 사용자가 버튼 기능을 사용하려는 경우).

그러면 순서는 다음과 같습니다.

  1. 다음 메서드로 생성된 Run Code
  2. 워크북을 즉시 저장 - 글꼴 변경이 계속 발생하는 것을 방지하지 않습니다.
  3. 워크북을 다시 열면 문제가 "해결"됩니다.

Private Sub printAllActiveXSizeInformation()
    Dim myWS As Worksheet
    Dim OLEobj As OLEObject
    Dim obName As String
    Dim shName As String

    'you could easily set a for/each loop for all worksheets
    Set myWS = Sheet1

    shName = myWS.name

    Dim mFile As String
    mFile = "C:\Users\you\Desktop\ActiveXInfo.txt"


    Open mFile For Output As #1
    With myWS
        For Each OLEobj In myWS.OLEObjects
            obName = OLEobj.name

            Print #1, "'" + obName
            Print #1, shName + "." + obName + ".Left=" + CStr(OLEobj.Left)
            Print #1, shName + "." + obName + ".Width=" + CStr(OLEobj.Width)
            Print #1, shName + "." + obName + ".Height=" + CStr(OLEobj.Height)
            Print #1, shName + "." + obName + ".Top=" + CStr(OLEobj.Top)
            Print #1, "ActiveSheet.Shapes(""" + obName + """).ScaleHeight 1.25, msoFalse, msoScaleFromTopLeft"
            Print #1, "ActiveSheet.Shapes(""" + obName + """).ScaleHeight 0.8, msoFalse, msoScaleFromTopLeft"

        Next OLEobj
    End With

    Close #1

    Shell "NotePad " + mFile



End Sub

*note: 안타깝게도 그룹화된 개체도 찾지 못합니다.

100% 신뢰할 수 있는 유일한 해결책은 Excel(보이지 않는 인스턴스 포함)을 닫고 다시 시작하는 것입니다.다른 솔루션은 문제가 있습니다.

그것이 제가 가능하면 통제를 피하는 이유 중 하나입니다.예는 여기를 참조하십시오.

이 모듈은 2011년 3월 20일 E-E의 dlmille에 의해 만들어졌습니다.

이 연습은 Excel이 "이상한" 상태가 되고 모양 크기가 틀어질 경우 워크북에 active-x 컨트롤 설정을 시트 단위로 저장하는 연습입니다. ListBox에 Integral Height 속성이 있지만 FALSE 설정의 측면 영향으로 컨트롤이 삐뚤어지는 것을 방지하고 명령 버튼에는 move/s와 같은 속성이 있습니다.셀 등으로 아이즈를 합니다. 다른 컨트롤은 우아하지 않습니다.

루틴 setControlsOnSheet(): 1) 활성 시트의 모든 OLEObject(active-x) 컨트롤에 대해 6개의 공통 컨트롤 설정을 얻고, 2) 문자열 배열에 해당 설정을 저장하고, sControlSettings()(3) 정의된 이름을 해당 설정으로 추가/업데이트합니다.

시트의 각 컨트롤에 대한 정의된 이름은 활성 시트 이름과 컨트롤 이름(유일한 인스턴스를 생성해야 함)을 기반으로 구축됩니다.

프로세스:사용자는 워크시트에 표시될 컨트롤을 모두 생성하고, 어느 시점에서든 setControlsOnSheet() 루틴을 실행하여 모든 컨트롤에 대한 설정을 초기에 저장하거나, 해당 설정을 새로 고치거나, 새 설정을 추가할 수 있습니다(시트의 모든 컨트롤에 대해 이렇게 함).

모든 설정이 "올바른" 상태가 되도록 주의해야 합니다(예: Excel이 아직 "이상한" 상태가 아니거나, 사용자가 자신의 컨트롤 중 하나를 조정하여 설정을 "저장"할 준비가 된 경우).그렇지 않으면 부적절한 크기의 컨트롤 설정이 저장됩니다.

시트 활성화를 위한 This Workbook 이벤트는 이 루틴 프로세스를 집중적으로 만들기보다는 방금 선택한 시트에 존재하는 모든 컨트롤에 대한 모든 설정을 "재초기화"합니다.이렇게 하면 시트의 제어 설정이 가장 최근에 저장된 설정으로 "복원"되므로 Excel의 크기 조정 결과가 발생하지 않도록 "영원히?"됩니다.

잠재적인 향상을 위해 이 앱은 추가 기능의 일부로 클래스 모듈에 내장될 수 있으며 따라서 관련 코드를 사용자의 "정상적인" 프로그래밍 환경에서 제외할 수 있습니다.예를 들어, 시트 활성화 이벤트 트래핑은 사용자가 이 워크북 모듈에 추가해야 하는 것이 아니라 클래스 모듈에 캡처됩니다.

Const CONTROL_OPTIONS = "Height;Left;Locked;Placement;Top;Width" 'some potentially useful settings to store and sustain

Function refreshControlsOnSheet(sh As Object)'routine enumerates all objects on the worksheet (sh), determines which have stored settings, then refreshes those settings from storage (in the defined names arena)

Dim myControl As OLEObject
Dim sBuildControlName As String
Dim sControlSettings As Variant

For Each myControl In ActiveSheet.OLEObjects
    sBuildControlName = "_" & myControl.Name & "_Range" 'builds a range name based on the control name
    'test for existance of previously-saved settings
    On Error Resume Next
    sControlSettings = Evaluate(sBuildControlName) 'ActiveWorkbook.Names(sBuildControlName).RefersTo 'load the array of settings
    If Err.Number = 0 Then ' the settings for this control are in storage, so refresh settings for the control
        myControl.Height = sControlSettings(1)
        myControl.Left = sControlSettings(2)
        myControl.Locked = sControlSettings(3)
        myControl.Placement = sControlSettings(4)
        myControl.Top = sControlSettings(5)
        myControl.Width = sControlSettings(6)
    End If
    Err.Clear
    On Error GoTo 0
Next myControl      
End Function

Private Sub storeControlSettings(sControl As String)
Dim sBuildControlName As String
Dim sControlSettings(1 To 6) As Variant ' set to the number of control settings to be stored
Dim oControl As Variant

Set oControl = ActiveSheet.OLEObjects(sControl)

'store the settings to retain, so they can be reset on demand, thus avoiding Excel's resizing "problem"
'create array of settings to be stored, with order dictated by CONTROL_OPTIONS for consistency/documentation

sControlSettings(1) = oControl.Height
sControlSettings(2) = oControl.Left
sControlSettings(3) = oControl.Locked
sControlSettings(4) = oControl.Placement
sControlSettings(5) = oControl.Top
sControlSettings(6) = oControl.Width


sBuildControlName = "_" & sControl & "_Range" 'builds a range name based on the control name

Application.Names.Add Name:="'" & ActiveSheet.Name & "'!" & sBuildControlName, RefersTo:=sControlSettings, Visible:=False 'Adds the control's settings to the defined names area and hides the range name
End Sub


Public Sub setControlsOnSheet()
Dim myControl As OLEObject

If vbYes = MsgBox("If you click 'Yes' the settings for all controls on your active worksheet will be stored as they CURRENTLY exist. " & vbCrLf & vbCrLf _
                & "Are you sure you want to continue (any previous settings will be overwritten)?", vbYesNo, "Store Control Settings") Then

    For Each myControl In ActiveSheet.OLEObjects 'theoretically, one could manage settings for all controls of this type...
        storeControlSettings (myControl.Name)
    Next myControl

    MsgBox "Settings have have been stored", vbOKOnly
End If
Application.EnableEvents = True 'to ensure we're set to "fire" on worksheet changes
End Sub

주석 및 도형에 대해서도 유사한 문제가 있습니다.한 가지 해결 방법은 를 기록하기 위해 매크로를 작성하는 것입니다..높이 특성과 사용하지 않는 워크시트에 있는 각 개체의 시트 위치 특성.그런 다음 필요에 따라 두 번째 매크로를 작성하여 이러한 속성을 다시 설정합니다.

버튼에 몇 가지 문제가 있었는데, 폰트 사이즈도 그 중 하나입니다.저는 버튼 크기를 조정하고 그 안에 있는 사진도 크기를 조정했습니다.버튼 크기를 다시 프로그램적으로 변경할 수는 있었지만 사진 크기를 그런 식으로 변경할 방법을 찾을 수 없었습니다.저는 이 문제들에 대한 궁극적인 해결책을 찾았다고 생각합니다.

(내 경우)에서 MSForms.exd 파일을 삭제하면 C:\Users{UserName}\AppData\Local\Temp\Excel8.0은 화면 해상도에서 버튼을 보고 Excel을 다시 시작하는 동안 이러한 문제가 사라지는 것 같습니다.다른 응용프로그램에 대해 삭제해야 할 다른 .exd 파일이 있습니다.그 중 일부는 다음과 같습니다.

C:\Users\[user.name]\AppData\Local\Temp\Excel8.0\MSForms.exd

C:\Users\[user.name]\AppData\Local\Temp\VBE\MSForms.exd

C:\Users\[user.name]\AppData\Local\Temp\Word8.0\MSForms.exd

PowerPoint용 문서도 있지만 관련 지원 문서를 찾을 수 없는 것 같습니다(기억에 남는 이러한 특정 문제는 실제로 나타나지 않습니다).

한 후 사용 에) 했지만, 는 명령어 를 에 (PC 에 한 했지만 할 를 과 해 을 이 을 해 을 에 Workbook_WindowActivateevent (이것은 "설정 재설정" 버튼을 통해서도 이루어질 수 있습니다.)

어쨌든 먼 곳의 연결을 다시 사용하고 두 개의 명령 버튼이 잘못되기 시작한 오늘까지는 모든 것이 해결되었다고 생각했습니다.나는 그 2개의 명령어 버튼이 Placement 속성을 2(Object는 셀과 함께 이동됨)로 설정하고 다른 명령어 버튼은 3(Object는 free floating)으로 설정한 것을 발견했습니다.

그러나 이를 찾기 전에 (속성 창을 통해) 원하는 대로 단추의 글꼴 크기를 설정하려고 했지만, 단추의 높이를 변경하기 전까지는 Windows(윈도우)에서 사용 중인 숫자를 무시하고 있었습니다.갑자기 글자 크기 속성을 읽고 그에 따라 조정했습니다.

배치 속성이 실제로 문제의 일부인지는 확실하지 않지만, 확실히 하기 위해 두 가지 솔루션을 사용합니다.

(1) 배치는 3으로 설정됩니다.

(2) 를 사용하여 트리거하는 나의 "자동 동기화" 기능Workbook_WindowActivate이벤트는 버튼과 폰트 크기를 조금 늘린 다음 원래대로 다시 줄입니다.하지만 (1) 해결책이면 충분할 겁니다...지금은 테스트할 시간이 없습니다.여기 제 코드가 있습니다.Workbook_Activate이벤트:

Worksheets(1).Shapes("CommandButton1").Top = 0
Worksheets(1).Shapes("CommandButton1").Left = 206.25
Worksheets(1).Shapes("CommandButton1").Width = 75
Worksheets(1).OLEObjects(1).Object.Font.Size = 10
Worksheets(1).Shapes("CommandButton1").Height = 21
Worksheets(1).Shapes("CommandButton1").Height = 18.75
Worksheets(1).OLEObjects(1).Object.Font.Size = 8

이제 모든 것이 잘 됩니다.인터넷에서 해결책을 찾는 데 과거에 시간이 좀 걸렸습니다.저는 이것이 적어도 한 사람에게 도움이 되기를 바랍니다 ;-)

@RuiHonori가 가장 좋은 답을 얻었다고 생각합니다. 하지만 제가 원하는 모든 시트를 원하는 위치로 컨트롤하기 위해 모든 시트를 사용했습니다. 모든 시트의 크기는 다음을 사용했습니다.

Sub SizeControls()
    Dim myControl As OLEObject
    Dim WS As Worksheet
    For Each WS In ThisWorkbook.Worksheets
        For Each myControl In WS.OLEObjects
            myControl.Height = 42.75
            myControl.Width = 96
        Next myControl
    Next WS
End Sub

나는 Rui Honorio의 제안을 변형한 솔루션을 준비했습니다.

시트 위에 여러 칸 콤보 박스를 올려 놓았습니다.내 버전의 "store" 루틴은 시트의 모든 OLE Objects(앞서 언급한 콤보박스 제외)를 루프하고 이름과 선택한 속성을 기록합니다.

콤보 박스는 시트의 다소 콤팩트한/내장된 구성요소입니다.상위 워크시트(또는 해당 문제의 경우 다른 시트)에서 셀을 사용하지 않습니다.잘 알려지지 않은 위치에 놓거나 아예 숨길 수도 있습니다.

그런 다음 "새로 고침" 루틴의 트리거 또는 수동 실행을 통해 콤보 상자의 각 목록 항목에서 속성을 가져와 각 컨트롤에 대해 속성을 재설정할 수 있습니다.

마이크로소프트가 이 버그를 수정하지 않은 것에 대해 매우 놀랍고 매우 실망스럽습니다.저는 몇 년 동안 간헐적으로 그것을 접해 왔습니다!

언급URL : https://stackoverflow.com/questions/19385803/how-to-stop-activex-objects-automatically-changing-size-in-office

반응형