להורדה | מאקרו המרת מרווח שורות בוורד ל'מדויק'
-
פוסט זה נמחק!
-
@שלמה11
סיקרנת אותי
הנה מאקרו לבדיקת התיאוריה:Sub CalculateLineHeight() Dim newDoc As Document Dim i As Single, x As Single Selection.CopyFormat Set newDoc = Documents.Add newDoc.Content = Chr(11) newDoc.Content.Select Selection.PasteFormat Selection.ParagraphFormat.SpaceBefore = 0 Selection.ParagraphFormat.SpaceAfter = 0 Selection.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle i = Selection.Information(wdVerticalPositionRelativeToPage) Selection.Collapse Direction:=wdCollapseEnd Debug.Print "Exact line-height by RelativeToTextBoundary: " & Selection.Information(wdVerticalPositionRelativeToTextBoundary) x = Selection.Information(wdVerticalPositionRelativeToPage) Debug.Print "Exact line-height by RelativeToPage: " & x - i newDoc.Close SaveChanges:=False End Sub
למעשה אולי @מאקרו או @menajemmendel יש לכם רעיון איך לתקן את הסטייה ש @שלמה11 כבר הזכיר?
כמו"כ מעניין לציין ששני השיטות מחזירים תוצאות שונות במיקצתעריכה: שיניתי את ה-intger ל- single יותר מדוייק
-
@pcinfogmach כתב בלהורדה | מאקרו המרת מרווח שורות בוורד ל'מדויק':
Dim i, x As Integer
עוד לא בדקתי אבל סתם ידיעה, שבאופן מאד לא אינטואיטיבי באופן זה אתה מגדיר כINTEGER רק את הX, והוא מקביל לעשות
Dim i Dim X as integer
-
לא הבנתי כוונתך שניהם מוגדרים כ-integer באותה שורה הרבה יותר נקי מלהגדיר אותם בנפרד
תנסה ב-option explicit ותראה ששניהם מוגדרים כראוי
-
@pcinfogmach כתב בלהורדה | מאקרו המרת מרווח שורות בוורד ל'מדויק':
לא הבנתי כוונתך שניהם מוגדרים כ-integer באותה שורה הרבה יותר נקי מלהגדיר אותם בנפרד
תנסה ב-option explicit ותראה ששניהם מוגדרים כראוי
כשהייתי צעיר גם אני חשבתי כמוך, אבל השנים עושים את שלו, סתם,
בהגיון אתה צודק, אבל האמת היא שלו, אם אתה רוצה שיהיה בשורה אחת תצטרך לכתוב כך:Dim i as integer, x as integer
אני יודע שזה מעצבן אבל הסיבה שזה קורה, משום שיש אפשרות להגדיר משתנה בלי להגדיר לו סוג משתנה, אתה יכול לבדוק לכתוב עם OPTION EXPLICIT
Dim i
ותראה שלא יתן לך שגיאה.
-
@pcinfogmach
יותר מזה תנסה:Sub sample() Dim i, x As Integer x = 10 Set i = Selection.Range End Sub
ותראה שלא יתן שגיאה
-
@pcinfogmach אני לא יודע, אבל מה שהעליתי במחקרים שלי, הוא שהבודד וכו', הם גודל בנקודות של הכתב כפול 1.15 ולפי זה עשיתי את החישוב הבא: אבל לא יוצא ממש מדוייק, לא יודע למה
Sub macro3() Dim ACTUAL_SPACING As Single, font_size As Single, meduyak_spacing As Single Dim para As Paragraph For Each para In Selection.Paragraphs If para.Format.LineSpacingRule <> wdLineSpaceExactly Then ACTUAL_SPACING = LinesToPoints(para.Format.LineSpacing) / 144 font_size = para.Range.Font.SizeBi meduyak_spacing = font_size * 1.15 * ACTUAL_SPACING With para.Format .LineSpacingRule = wdLineSpaceExactly .LineSpacing = meduyak_spacing End With End If Next para End Sub
שאלה בקשר לפורום: למה לפעמים הקודים יוצאים צבעונים ולפעמים הכל ירוק?
-
@menajemmendel
זה לא יעבוד בפונטים עם גובה שאינו סטנדרטילגבי הקודים הציבעוניים זה בגלל המציד של הקודים לא בנוי דווקא ל-vba אז אם יש משהו בקוד שהוא מסויים ל-vba האו לא מצליח לצבוע אותו
-
@pcinfogmach כתב בלהורדה | מאקרו המרת מרווח שורות בוורד ל'מדויק':
הנה מאקרו לבדיקת התיאוריה:
לא הבנתי מה רע במאקרו שעשיתי עד ש"קלטתי שהוא נעול בסיסמא..."
אז הנהSub המרת_מרווח_בין_שורות_למדויק() Dim Firstline As Double Dim Secondline As Double Dim Exactspacing As Double Dim lineCount As Integer Dim currentPage As Integer Dim paragraphCount As Long Dim savedRange As Range Application.ScreenUpdating = False Application.UndoRecord.StartCustomRecord Set savedRange = Selection.Range ' הגדרת מיקום השורה הראשונה והשניה Selection.SetRange Start:=Selection.Paragraphs(1).Range.Start, End:=Selection.Paragraphs(1).Range.Start Firstline = Selection.Information(wdVerticalPositionRelativeToPage) lineCount = Selection.Paragraphs(1).Range.ComputeStatistics(wdStatisticLines) currentPage = Selection.Information(wdActiveEndPageNumber) If lineCount = 1 Then Selection.TypeText text:=Chr(11) If currentPage < Selection.Information(wdActiveEndPageNumber) Then Firstline = Selection.Information(wdVerticalPositionRelativeToPage) Selection.TypeText text:=Chr(11) End If Else Selection.MoveDown unit:=wdLine, Count:=1 End If Secondline = Selection.Information(wdVerticalPositionRelativeToPage) ' חישוב מרווח השורות והגדרת המרווח למדויק Exactspacing = Secondline - Firstline Selection.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly Selection.ParagraphFormat.LineSpacing = Exactspacing ' מחיקת השורות הריקות שנוספו If lineCount = 1 Then Selection.TypeBackspace End If If currentPage < Selection.Information(wdActiveEndPageNumber) Then Selection.TypeBackspace End If savedRange.Select Application.UndoRecord.EndCustomRecord Application.ScreenUpdating = True End Sub
דרך אגב מאוד מומלץ להוסיף את 3 השורות הראשונות והאחרונות בקוד לכל קוד בvba
בפשטות זה השיטה הכי מדויקת, כי אם תריץ אותה על פיסקה שכבר מוגדרת על מרווח שורות מדויק התוצאה תהיה זהה בדיוק למצב הקיים. -
@שלמה11 כתב בלהורדה | מאקרו המרת מרווח שורות בוורד ל'מדויק':
דרך אגב מאוד מומלץ להוסיף את 3 השורות הראשונות והאחרונות בקוד לכל קוד בvba
נכון, אבל אם אתה מוסיף את זה אז עוד יותר חשוב להוסיף גם error handeling, כמו שהסברתי כאן
-
על פי הוראותיו של @pcinfogmach מפה
Sub המרת_מרווח_בין_שורות_למדויק2() Dim Secondline As Double Dim lineCount As Integer Dim currentPage As Integer Dim paragraphCount As Long Dim savedRange As Range Application.ScreenUpdating = False Application.UndoRecord.StartCustomRecord Set savedRange = Selection.Range paragraphCount = Selection.Paragraphs.Count For i = 1 To paragraphCount Selection.SetRange Start:=Selection.Paragraphs(1).Range.Start, End:=Selection.Paragraphs(1).Range.Start lineCount = Selection.Paragraphs(1).Range.ComputeStatistics(wdStatisticLines) currentPage = Selection.Information(wdActiveEndPageNumber) If lineCount = 1 Then Selection.TypeText text:=Chr(11) If currentPage < Selection.Information(wdActiveEndPageNumber) Then Selection.TypeText text:=Chr(11) End If Else: Selection.MoveDown unit:=wdLine, Count:=1 End If Secondline = Selection.Information(wdVerticalPositionRelativeToTextBoundary) Selection.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly Selection.ParagraphFormat.LineSpacing = Secondline If lineCount = 1 Then Selection.TypeBackspace If currentPage < Selection.Information(wdActiveEndPageNumber) Then Selection.TypeBackspace Next i savedRange.Select Application.UndoRecord.EndCustomRecord Application.ScreenUpdating = True End Sub
צריך גם להוסיף תו בודד במקרה שאין שום דבר בפיסקה, אם לא זה יוצר באג
הבעיה במרווח מדויק זה שהרווח נמצא מעל השורה ולא מתחת אם מישהו יודע לסדר את זה
אולי צריך משהו כמו יישור למעלה כמו שיש בתיבות טקסט
הבעיה שלא מצאתי משהו כזה בשביל פיסקאות רגילות