2017-05-08 18 views
0

localc 스프레드 시트에서 셀 텍스트를 수동으로 편집하고 일부 텍스트를 굵게, 기울임 꼴 또는 다른 것으로 표시 할 수 있음을 알고 있습니다.Libreoffice Calc Basic에서 셀 텍스트의 일부를 굵게 표시합니까?

매크로를 사용하여 동일한 작업을 수행하고 싶습니다. 특정 셀에 삽입되는 요약 문자열을 작성합니다.

        카테고리 1 : 요약 문자열이 같은 여러 줄이 들어, 항목 2 항목 1을 항목 3
        구분 2 : 항목 1, 항목 2, ...
        CategoryN : 항목 1, 항목 2, ...

주어진 카테고리가 비어 있는지 여부에 따라 셀의 ~ 4 ~ 12 개의 카테고리 행이있을 수 있습니다.

내가해야 할 기능은 작동하고 있으며, 지금까지 내가 원하는 것입니다. 하지만 지금은이 같은 셀의 「카테고리」부분을 굵게하려면 :

        카테고리 1 : 항목 1을 항목 2, 항목 3
        구분 2 : 항목 1, 항목 2 .. .
        CategoryN : 항목 1, 항목 2, ...

,

LO 기본에서 이것을 할 수 있습니까? 셀에서 수동 편집을 수행하는 것이 가능하다는 것을 알고 있지만,이 작업은 스크립팅의 전체 목적을 무효화합니다.

내가 (이름이 "셀"이상하게도)를 요약 문자열을 구축하고 셀 객체에 삽입 함수의 맨 아래에 지금까지 무엇을 가지고 : 일부

newline = chr(10) 
cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills") 



Dim next_nl as Integer 
Dim next_colon as Integer 
Dim TC as Object ' TextCursor object pointing into the cells text 

TC = cell.createTextCursor 

next_nl=1 ' start at first char of cell 

While (next_nl > 0) 
    TC.collapseToStart 
    TC.gotoStart(false) ' move to start of cell 

    if (next_nl > 1) Then TC.goRight(next_nl, false) ' move to next_nl 

    TC.goRight(0,true) ' begin selection 

    next_colon = InStr(next_nl, cell.String, ":") 

    If next_colon Then 
     TC.goRight(next_colon, true) ' extend selection to next colon 
     TC.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection 
     next_nl = InStr(next_colon, cell.String, newline) ' jump to the next LF 
    Else 
     next_nl = 0 ' no more colons to be found, finish up.' 
    Endif 

Wend 

그것을 공장. 첫 번째 줄에는 범주 굵게 및 항목 일반 텍스트가 있습니다. 지금까지 완벽 해.

불행히도, 두 번째 줄의 시작부터 두 번째 줄의 중간까지 (어쩌면 무엇이 이상한가)는 완전히 굵은 글씨입니다. 아마도 Instr()이 혼합 형식 텍스트로 제대로 작동하지 않을 것으로 의심됩니다. 문자 수가 잘못 계산됩니다.

다른 것들 내가 해봤/아이디어 :

  • 나는 CR chr(13)보다는 LF chr(10) 검색을 시도했다 그러나 그것은 전혀 작동하지 않았다. MS-DOS CR 라인 엔딩을 사용하기를 기대했지만 적절한 유닉스 LF 라인 엔딩을 사용합니다 (라인 사이에 CR을 추가하더라도 LF로 변환됩니다). Linux에서 실행 중이므로이 작업을 수행 할 때 실행 환경을 감지하고 Linux, Windows 등의 적절한 줄 끝 스타일을 사용해야합니다.

  • 모든 패스에서 다시 초기화해야 할 경우에 대비하여 while 루프 안에 Tc=cell.createTextCursor을 이동 시키려고했습니다.아무런 차이가 없으므로 동일한 결과를 얻을 수 있습니다.

    AFAICT, 커서에 '재설정 선택'유형 기능이없는 것처럼 보입니다.

  • 어쩌면 몇 가지 이상한 변수 범위 문제가 있습니다.하지만 LO에서 변수 범위에 대한 지식이 거의 없기 때문에 LO 매크로에 익숙하지 않습니다. 주로 sh, awk, perl 또는 파이썬, 그리고 내가 Basic에서 무엇을 쓴 마지막 시간은 1980 년대로 거슬러 올라간다.

  • 나는 위의 내용이 문제에 대한 좋은 접근 방법이 아닌 것인지 잘 모르겠다. 문서를 검색 할 때 가장 먼저 생각한 것일뿐입니다. 필자는 필요한 경우 더 좋은 아이디어로 시작하는 것보다 더 기쁩니다.

  • "스킬"이라는 이름의 범위는 LF가 포함 된 하나의 큰 긴 문자열이 아니라 카테고리 당 하나의 셀이어야한다고 생각하기 시작했습니다. 그런 다음 개별적으로 반복 할 수 있습니다. 그렇게하면 스프레드 시트의 다른 부분을 상당히 변경해야하므로 필자는 꼭 그렇게하지 않으려 고하지 않습니다.

추신 : 나는 알고있다 ... 나는 완벽 주의자이다. 카테고리 이름을 대문자로하면 효과가 있지만 (실제로는 그렇다) 추악하다. 그것들을 묶는 것은 훨씬 더 좋을 것입니다 ... 그리고이 요약 페이지의 목적은 예쁜 프레젠테이션을위한 것입니다.

+0

친애하는 익명 downvoter -이 Q는 스프레드 시트에 삽입되는 프로그래밍 언어에 관한 것입니다. 하지만 여전히 프로그래밍 문제입니다. 응용 프로그램 사용 질문이 아니라 셀 수식이나 다른 수퍼 유저 질문이 수퍼 유저 나 헬프 데스크에 더 적합합니다. 그것이 Basic에 있더라도 프로그래밍입니다. 스프레드 시트에서. SO에 관한 "장난감"과 같은 언어에 관한 다른 질문은 많이 있습니다. – cas

+0

다소 긴 질문 이었기 때문에 다운 된 것일까 요? 그것은 나에게 잘 보인다. 자세한 내용은 도움이됩니다. –

+0

예, 질문자가 자신을 알아 내려고 시도했음을 보여주고 그들이하려고하는 것과 같은 유용한 세부 정보를 제공한다고 표시하면 질문에 대답하는 경향이 더 커집니다 (XY 문제이거나 더 나쁜 경우에는 "WTF ? "). – cas

답변

1

InStr()은 Windows에서도 잘 작동합니다. goRight() 근처에 단순한 버그가있었습니다.

Sub BoldPartOfCell 
    Dim next_nl As Integer ' position of the next newline 
    Dim next_colon As Integer 
    Dim cursor As Object ' TextCursor object pointing into the cell's text 

    NEWLINE = Chr(10) ' the LibreOffice line break character 
    cell = ThisComponent.Sheets.getByName("Summary").getCellRangeByName("Skills") 
    cursor = cell.createTextCursor 
    next_nl = 1 ' start at first char of cell 
    Do While True 
     cursor.collapseToStart 
     cursor.gotoStart(False) ' move to start of cell 
     if (next_nl > 1) Then cursor.goRight(next_nl, False) ' move to next_nl 
     next_colon = InStr(next_nl, cell.String, ":") 
     If next_colon > 0 Then 
      ' extend selection to next colon 
      cursor.goRight(next_colon - next_nl + 1, True) 
      cursor.CharWeight = com.sun.star.awt.FontWeight.BOLD ' bold the selection 
      next_nl = InStr(next_colon, cell.String, NEWLINE) ' jump to the next LF 
     Else 
      Exit Do 
     End If 
    Loop 
End Sub 
+0

완벽한! 고맙습니다. 그리고 ... 이런! goRight()가 현재 위치와 관련이 있다는 것을 알았지 만 나는 절대적인 것으로 간주하고있었습니다. BTW, 셀 및 개행 정의는 컨텍스트를 표시하기 위해 코드 샘플의 맨 위에 격리되었습니다. 버그를 볼 수있게되었으므로 하위로 변환하고'Sub BoldPartOfCell (셀을 Object로, ByVal로 BoldStart를 문자열로, ByVal를 BoldStop으로 String으로) 일반화 해 보겠습니다. ' – cas