記載予定

Sub ReIndentFormModule()

    Dim vbComp As VBComponent

    Dim codeMod As CodeModule

    Dim codeLines As String

    Dim lineNum As Long

    Dim formattedCode As String

    

    ' 対象のフォームモジュールを設定(例: "UserForm1")

    Set vbComp = ThisWorkbook.VBProject.VBComponents("UserForm1")

    Set codeMod = vbComp.CodeModule

    

    ' フォームのコード部分を取得

    codeLines = ""

    For lineNum = 1 To codeMod.CountOfLines

        codeLines = codeLines & codeMod.Lines(lineNum, 1) & vbCrLf

    Next lineNum

    

    ' 再インデント処理(例: 各行の先頭にスペースを追加)

    ' ※実際の再インデントロジックは必要に応じて変更してください

    formattedCode = ReIndentCode(codeLines)

    

    ' フォームのコード部分を上書き(デザイン情報は保持される)

    codeMod.DeleteLines 1, codeMod.CountOfLines ' 既存のコードを削除

    codeMod.AddFromString formattedCode ' 整形済みコードを追加

End Sub

 

' 再インデントのロジック(簡単な例としてスペースを追加)

Function ReIndentCode(ByVal code As String) As String

    Dim codeLines() As String

    Dim line As String

    Dim formattedLines As String

    Dim i As Long

    

    ' コードを行ごとに分割

    codeLines = Split(code, vbCrLf)

    formattedLines = ""

    

    ' 各行にインデントを追加

    For i = LBound(codeLines) To UBound(codeLines)

        line = codeLines(i)

        formattedLines = formattedLines & "    " & line & vbCrLf ' スペース4つのインデント

    Next i

    

    ReIndentCode = formattedLines

End Function

Sub 図形内の文字を取得()

    Dim shp As Shape

    Dim strText As String

 

    For Each shp In ActiveSheet.Shapes

        strText = shp.TextFrame.Characters.Text

        MsgBox shp.Name & "   " & strText

    Next shp

End Sub

Sub RenameDuplicateShapes()

    Dim shapeDict As Object

    Set shapeDict = CreateObject("Scripting.Dictionary")

    

    Dim ws As Worksheet

    Dim shp As Shape

    Dim originalName As String

    Dim newName As String

    Dim counter As Long

    

    ' アクティブシートを取得(必要に応じて特定のシートを指定してください)

    Set ws = ActiveSheet

    

    ' シート内のすべての図形に対して処理

    For Each shp In ws.Shapes

        originalName = shp.Name

        

        ' 既に存在する図形名である場合、名称を変更

        If shapeDict.Exists(originalName) Then

            counter = shapeDict(originalName) + 1

            newName = originalName & "_" & counter

            

            ' 新しい名前が既に存在するか確認し、存在する場合はさらにインクリメント

            Do While shapeDict.Exists(newName)

                counter = counter + 1

                newName = originalName & "_" & counter

            Loop

            

            ' 図形の名前を変更し、辞書に追加

            shp.Name = newName

            shapeDict.Add newName, 1

            shapeDict(originalName) = counter

        Else

            ' 新しい図形名として辞書に登録

            shapeDict.Add originalName, 1

        End If

    Next shp

    

    MsgBox "重複する図形名を修正しました。", vbInformation

End Sub

Option Explicit

 

Public WithEvents wb As Workbook          'この wbはAppEventClass の Set AppEvws1.wb = wb に対応

                                                              'この名前を合わせないと上記の文がエラーになる

'                               ’AppEvWs(このクラスモジュール名) ⇒ AppEvws1(そのインスタンス名)⇒をこで使われるWorkbook名(wb)と定義

'                               ’クラスモジュール間で引数をやり取りする方法

Private Sub Wb_SheetActivate(ByVal Sh As Object)      'App イベントのひとつ(シートチェンジ)

    ' フォームのShowFormメソッドを呼び出して、シート名を表示

    MsgBox wb.Name & " / " & Sh.Name

End Sub

 

'まとめ

'①

'    workbookopenかform Initiarize で Appイベントの使用を宣言

    'Private Sub Workbook_Open()

    '    ' Applicationオブジェクトのイベントを有効化

    '    ' VBAが異常終了するとこの文は無効になるのでできたら他で(フォームの立ち上げとか)で宣言した方が好ましい

    '    Application.EnableEvents = True

    '    ' WorkbookActivateイベントを監視するためにイベントを有効化

    '    Set AppEvHandl = New AppEventClass     'Setの次の項目は標準モジュールで Public AppEvHandl As New AppEventClass のように定義する

    '                                                                  'New の次の項目はこのイベントを扱うクラスモジュール名

    '

    'End Sub

'②標準モジュール先頭に  クラスモジュールのインスタンスを作成

'    Public AppEvHandl As New AppEventClass

'③ActiveWorkbookが変わった時のクラスモジュール ここではAppEventClassを作成する

    '  その内容

    'Public WithEvents App As Application      '定型文

    'Private AppEvws1 As AppEvWs              '左辺AppEvWsのインスタンス名 右辺はシートチェンジを扱うクラスモジュール名

    '

    'Private Sub Class_Initialize()

    '    Set App = Application                '定型文

    'End Sub

    'Private Sub App_WorkbookActivate(ByVal wb As Workbook)        'Appイベントのひとつ ActiveWorkbookが替わったときにイベントが発生する

    ' If wb.Name <> ThisWorkbook.Name Then                                    'この場合アプリの仕様上自身のワークブック選択時は除外している

    '        Set AppEvws1 = New AppEvWs                                              '左辺AppEvWs のインスタンス'

    '        Set AppEvws1.wb = wb                                                        'AppEvWsの中で使われるworkbook名を代入(wbはこのプロシージャの ws As Workbookで引数として

    '                                                                                                  'App から受け取っている

    '        Dim activeSheetName As String

    '        activeSheetName = wb.ActiveSheet.Name                              'wbのActiveSheet名 このくだりを書かないとActiveBookが替わった時のそのシート名を取得できない

    '         MsgBox wb.Name & " / " & ActiveSheet.Name

    ' End If

    ''End Sub

'④シートチェンジしたときのイベントをとらえるクラスモジュール AppEvWs を作成する

'  上記文

 

 Option Explicit

 Public IsUpdatingListBox As Boolean

Private Sub ListBox1_Click()

    If Not IsUpdatingListBox Then

        With ListBox1

            TextBox1 = .List(.ListIndex, 0)

            TextBox2 = .List(.ListIndex, 1)

        End With

    End If

End Sub

 

Private Sub CommandButton2_Click()

    IsUpdatingListBox = True ' フラグを立てる

    With ListBox1

        .List(.ListIndex, 0) = TextBox1

        .List(.ListIndex, 1) = TextBox2

    End With

    IsUpdatingListBox = False ' フラグを戻す

End Sub

 

Sub B010_02B()

    Dim dic1 As Object

    Set dic1 = CreateObject("Scripting.dic1ionary")

    Dim i As Long

 

    ' クラスモジュールをインスタンス化 (クラスモジュール名は適宜変更)

    Dim objCustomer As Customer

 

    ' 取引先データを連想配列に格納

        For i = 2 To 6

            Set objCustomer = New Customer

            With objCustomer

                .取引先名 = Cells(i, "K").Value

                .取引先郵便番号 = Cells(i, "L").Value

                .取引先住所 = Cells(i, "M").Value

            End With

            dic1.Add Key:=Cells(i, "J").Value, Item:=objCustomer

        Next i

          

        For i = 2 To 4

            If dic1.Exists(Cells(i, "B").Value) Then

                With dic1(Cells(i, "B").Value)

                    Cells(i, "C").Value = .取引先名

                    Cells(i, "D").Value = .取引先郵便番号

                    Cells(i, "E").Value = .取引先住所

                End With

            End If

        Next i

    

End Sub

 

 

Private p_取引先名 As String

Private p_取引先郵便番号 As String

Private p_取引先住所 As String

'オブジェクトのプロパティに値を代入するときに使用します。

Public Property Let 取引先名(ByVal Value As String)

    p_取引先名 = Value

End Property

'オブジェクトのプロパティの値を取得するときに使用します 呼ばれるとクラスオブジェクト内の該当項目を返す

Public Property Get 取引先名() As String

    取引先名 = p_取引先名

End Property

Public Property Let 取引先郵便番号(ByVal Value As String)

    p_取引先郵便番号 = Value

End Property

Public Property Get 取引先郵便番号() As String

    取引先郵便番号 = p_取引先郵便番号

End Property

Public Property Let 取引先住所(ByVal Value As String)

    p_取引先住所 = Value

End Property

Public Property Get 取引先住所() As String

    取引先住所 = p_取引先住所

End Property

 

Sub B010_02C()

    Dim dic1 As Object

    Dim 取引先名 As String

    Dim 取引先郵便番号 As String

    Dim 取引先住所 As String

    Dim i As Long

    Set dic1 = CreateObject("Scripting.dictionary")

 

    ' クラスモジュールをインスタンス化 (クラスモジュール名は適宜変更)

    Dim cust As Custom2A

'     取引先データを連想配列に格納

    For i = 2 To 6

            取引先名 = Cells(i, "K").Value

            取引先郵便番号 = Cells(i, "L").Value

            取引先住所 = Cells(i, "M").Value

        

            Set cust = New Custom2A

            cust.p_取引先名2 = 取引先名

            cust.p_取引先郵便番号2 = 取引先郵便番号

            cust.p_取引先住所2 = 取引先住所

            dic1.Add Key:=Cells(i, "J").Value, Item:=cust

        Next i

          

        For i = 2 To 4

            If dic1.Exists(Cells(i, "B").Value) Then

                Set cust = dic1(Cells(i, "B").Value)

                Cells(i, "C").Value = cust.p_取引先名2

                Cells(i, "D").Value = cust.p_取引先郵便番号2

                Cells(i, "E").Value = cust.p_取引先住所2

            End If

        Next i    

End Sub

Option Explicit

 

Public p_取引先名2 As String

Public p_取引先郵便番号2 As String

Public p_取引先住所2 As String

' ProcedureInfoクラスモジュール
Public Name As String
Public StartLine As Long
Public EndLine As Long
Public Calls As Collection
 
Private Sub Class_Initialize()
    Set Calls = New Collection
End Sub
 
 
 
ub AnalyzeProcedures()
    Dim ws1 As Worksheet, ws2 As Worksheet, ws3 As Worksheet
    Dim procDict As Object
    Dim i As Long, j As Long
    Dim procName As String, startLine As Long, endLine As Long
    Dim procInfo As ProcedureInfo
 
    Set ws1 = ThisWorkbook.Sheets("Sheet1")
    Set ws2 = ThisWorkbook.Sheets("Sheet2")
    Set ws3 = ThisWorkbook.Sheets("Sheet3")
    Set procDict = CreateObject("Scripting.Dictionary")
 
    ' Sheet2からプロシージャ情報を読み込む
    For i = 2 To ws2.Cells(ws2.Rows.Count, 1).End(xlUp).Row
        procName = ws2.Cells(i, 1).Value
        startLine = ws2.Cells(i, 2).Value
        endLine = ws2.Cells(i, 3).Value
 
        Set procInfo = New ProcedureInfo
        procInfo.Name = procName
        procInfo.StartLine = startLine
        procInfo.EndLine = endLine
 
        procDict.Add procName, procInfo
    Next i
 
    ' プロシージャの呼び出し関係を解析
    For Each procName In procDict.Keys
        Set procInfo = procDict(procName)
        For j = procInfo.StartLine To procInfo.EndLine
            If InStr(ws1.Cells(j, 1).Value, "Call ") > 0 Then
                Dim calledProc As String
                calledProc = Trim(Split(ws1.Cells(j, 1).Value, "Call ")(1))
                If procDict.Exists(calledProc) Then
                    procInfo.Calls.Add procDict(calledProc)
                End If
            End If
        Next j
    Next procName
 
    ' ネスト構造をSheet3に出力
    ws3.Cells.Clear
    Dim row As Long
    row = 1
    For Each procName In procDict.Keys
        Set procInfo = procDict(procName)
        Call WriteProcedure ws3, procInfo, row, 0
    Next procName
End Sub
 
Sub WriteProcedure(ws As Worksheet, procInfo As ProcedureInfo, ByRef row As Long, indent As Long)
    ws.Cells(row, 1).Value = String(indent * 2, " ") & procInfo.Name
    row = row + 1
    Dim calledProc As ProcedureInfo
    For Each calledProc In procInfo.Calls
        Call WriteProcedure(ws, calledProc, row, indent + 1)
    Next calledProc
End Sub

' OneDriveフォルダのFileSystemObjectを取得

Set fso = CreateObject("Scripting.FileSystemObject")

 

' ファイルの存在を確認

strFilePath = fso.GetSpecialFolder(SHFOLDER_LOCAL_APPDATA) & "\Microsoft\OneDrive\test.xlsx"

If Not fso.FileExists(strFilePath) Then

    ' ファイルが存在しない

    MsgBox "ファイルが存在しません。"

Else

    ' ファイルが存在する

    ' ファイルの属性情報を確認

    Set fsoFile = fso.GetFile(strFilePath)

    If fsoFile.Attributes And vbReadOnly Then

        ' ファイルが開けない

        MsgBox "ファイルが開けません。(アクセス権不足)"

    Else

        ' ファイルを開ける

        Workbooks.Open strFilePath

    End If

End If

Sub ABC3()

'B,C,D,E で合成キーを作成 但し、C2桁 D2桁 E 1桁とする

Dim i, L1, L2, LMax As Long

'文字列の最大列数を求める

For i = 2 To 5

L1 = Len(Cells(i, "B"))

If LMax < L1 Then LMax = L1

Next

For i = 2 To 5

L2 = Len(Cells(i, "B"))

Cells(i, "G") = Cells(i, "B") & String(LMax - L2 + 1, " ") & Right("00" & Cells(i, "C"), 2) & _

" " & Right("00" & Cells(i, "D"), 2) & " " & Right("0" & Cells(i, "E"), 1)

Next

Range("G:G").Font.Name = "Consolas"

End Sub

 

 

Sub atest2()

Dim sizea As Long

Dim fonta As String

Dim chlen As Long

Dim slflg As Boolean

Dim cnam As Variant

Dim color1 As Variant

Dim maru As Double

ActiveSheet.Shapes.Range(Array("四角形: 角を丸くする 1")).Select

cnam = Selection.ShapeRange.TextFrame.Characters.Text   'コピー元の文字を取得

chlen = Len(cnam)

With Selection.ShapeRange.TextFrame2.TextRange

    sizea = .Font.Size    'コピー元のフォントサイズを取得

    fonta = .Font.Name       'コピー元のフォント名を取得

End With

With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, 1).Font

    slflg = .Bold    'コピー元が太字かどうか取得

    color1 = .Fill.ForeColor.RGB    'コピー元の色を取得

 End With

 If Selection.Name Like "*四角形: 角を丸くする*" Or Selection.Name Like "*Rounded Rectangle*" Then

   maru = Selection.ShapeRange.Adjustments.Item(1)

 End If

 

ActiveSheet.Shapes.Range(Array("四角形: 角を丸くする 2")).Select        'コピー先文字のプロパディを設定

If Selection.Name Like "*四角形: 角を丸くする*" Or Selection.Name Like "*Rounded Rectangle*" Then

Selection.ShapeRange.Adjustments.Item(1) = maru  '角の丸さを設定

End If

 

Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = cnam     'コピー元の文字を貼り付け

Selection.ShapeRange.TextFrame2.TextRange.Font.Size = sizea                     'コピー元のフォントサイズを適用

With Selection.ShapeRange.TextFrame2.TextRange.Font                'コピー元のフォント名を適用

    .NameComplexScript = fonta

    .NameFarEast = fonta

    .Name = fonta

End With

    

With Selection.ShapeRange(1).TextFrame2.TextRange.Characters(1, chlen).Font     'コピー先文字のプロパディを適用

    .Fill.Visible = msoTrue

    .Fill.ForeColor.RGB = color1    'コピー先文字の色を適用

    If slflg = True Then .Bold = msoTrue       'コピー先文字の太さを適用

End With

End Sub

範囲内の図形選択

Sub Getshape1()

Dim i As Long

Dim shp As Shape

Dim Range1 As Range

Dim Range2 As Range

Dim ary1()

Set Range1 = Selection

For Each shp In Range1.Worksheet.Shapes

    Set Range2 = Range(shp.topleftcell, shp.bottomRightCell)

    If Not Intersect(Range2, Range1) Is Nothing Then

        If Intersect(Range2, Range1).Address = Range2.Address Then

            i = i + 1

            ReDim Preserve ary1(i)

            ary1(i) = shp.Name

        End If

    End If

Next

ActiveSheet.Shapes.Range(ary1).Select

 

End SubSub Getshape1()

Dim i As Long

Dim shp As Shape

Dim Range1 As Range

Dim Range2 As Range

Dim ary1()

Set Range1 = Selection

For Each shp In Range1.Worksheet.Shapes

    Set Range2 = Range(shp.topleftcell, shp.bottomRightCell)

    If Not Intersect(Range2, Range1) Is Nothing Then

        If Intersect(Range2, Range1).Address = Range2.Address Then

            i = i + 1

            ReDim Preserve ary1(i)

            ary1(i) = shp.Name

        End If

    End If

Next

ActiveSheet.Shapes.Range(ary1).Select

End Sub

Sub 図形名分割2(図形名 As Variant)   'name3とnama2はpublic定義の必要あり 図形内文字分割

Dim ar5()

Dim i, leng1, leng2 As Long

Dim 結果

Dim s_flg As Long

 

leng1 = Len(図形名)

'図形名を1文字ずつ分解する

For i = 1 To leng1

ReDim Preserve ar5(2, i)

'1行目に図形名 2行目に文字数字区分(数字 0 文字 1)

ar5(1, i) = Mid(図形名, i, 1)

If IsNumeric(ar5(1, i)) Then

ar5(2, i) = 0

Else

ar5(2, i) = 1

End If

Next

 

leng2 = 0    'leng2 は文字数の数

For i = 1 To leng1

leng2 = leng2 + 1

If ar5(2, i) = 0 Then Exit For

Next

If leng2 <> leng1 Then

name2 = Left(図形名, leng2 - 1)

Else

name2 = 図形名

End If

 

MsgBox name2 & " GG"

name3 = Right(図形名, leng1 - leng2 + 1)

 

 

End Sub

Private Sub 図形連番コピー_Click()

Dim ar3()

Dim i, k As Long

Dim digit1, digit2, digit3 As Long 'digit1 元の図形内数字の桁数、digit2演算後の桁数

Dim ar5()

Dim shp As Shape

Dim shp_n As String

Dim moji1 As String

Dim top1, top2, left1, height1, intaval1 As Double

 

Dim count, name2v As Long

intaval1 = 20

 Dim ゼロ詰め後 As String

count = InputBox("コピー回数")

 

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange '実際は一回しかループしない

shp_n = shp.Name

top1 = shp.Top

left1 = shp.Left

height1 = shp.Height

Next

name2v = Val(name2)

ReDim ar5(count)

moji1 = ActiveSheet.Shapes(shp_n).TextFrame.Characters.Text  'テキスト内文字取得

Call 図形名分割2(moji1)      '文字を 分割 name2 テキスト内文字列 文字部分 name3  テキスト内文字列 数字部分

digit1 = Len(name3)

k = Val(name3)

For i = 1 To Val(count)

If k <> 0 Then

k = k + 1

'最初の桁数に連番が収まるようにする処理

digit2 = Len(CStr(k))

digit3 = digit1 - digit2

    ' 条件によって桁数を制御

    If digit3 = 3 Then

        ゼロ詰め後 = "000" & k

    ElseIf digit3 = 2 Then

        ゼロ詰め後 = "00" & k

    ElseIf digit3 = 1 Then

        ゼロ詰め後 = "0" & k

    Else

        ゼロ詰め後 = CStr(k) '

    End If

ar5(i) = name2 & ゼロ詰め後   '編集後テキスト内文字

Else

ar5(i) = name2

End If

Next

Range("c5:e15") = ar5

'実際の図形のコピー処理

For i = 1 To Val(count)

 

 ActiveSheet.Shapes.Range(Array(shp_n)).Select

    Selection.Copy

    ActiveSheet.Paste

    '図形内文字列の編集

    Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = ar5(i)

    Selection.Left = left1

    top2 = top1 + ((intaval1 + height1) * i)

    Selection.Top = top2

    DoEvents

Next

 

End Sub

Sub バブルソート(ByRef argAry() As Variant, ByVal keyPos As Long)

    Dim vSwap

    Dim i As Integer

    Dim j As Integer

    Dim k As Integer

    For i = LBound(argAry, 1) To UBound(argAry, 1)

        For j = LBound(argAry) To UBound(argAry) - 1

            If argAry(j, keyPos) > argAry(j + 1, keyPos) Then

                For k = LBound(argAry, 2) To UBound(argAry, 2)

                    vSwap = argAry(j, k)

                    argAry(j, k) = argAry(j + 1, k)

                    argAry(j + 1, k) = vSwap

                Next

            End If

        Next j

    Next i

 

End Sub

Sub 罫線シフト()

 Dim kb As Long

 Dim flg1 As String

 Dim i, sen1, sen2, wht1, wht2 As Long

 Dim strow, edrow, CurrentRow, stcol As Long

 Dim targetcell As Range

 Dim target, topleftcell As Range

 Dim kb2 As Object

 Set target = Selection

 If Not target Is Nothing Then  '何かしたセルが選択されているとき

    Set topleftcell = target.Cells(1, 1)   ' 左上のセルを取得

    stcol = topleftcell.Column      ' 左上のセルの列

    strow = topleftcell.Row          '左上のセルの行

 

    edrow = topleftcell.SpecialCells(xlCellTypeLastCell).Row    'その列の最大行(文字なしを含む)

    Set targetcell = topleftcell        'targetcellはoffsetで変動させる

    If targetcell.Borders(xlEdgeRight).LineStyle <> xlNone Then

        flg1 = "R"

    Else

        If targetcell.Borders(xlEdgeLeft).LineStyle <> xlNone Then

            flg1 = "L"

        End If

    End If

    If flg1 = "" Then Exit Sub

    sen1 = targetcell.Borders(xlEdgeLeft).LineStyle      '計算のプロパティを取得

    sen2 = targetcell.Borders(xlEdgeRight).LineStyle

    wht1 = targetcell.Borders(xlEdgeLeft).Weight

    wht2 = targetcell.Borders(xlEdgeRight).Weight

    

    CurrentRow = strow

    For i = strow To edrow      '1セルずつ下にたどり罫線の続いている最下行を求める

      Set targetcell = targetcell.Offset(1, 0)

      If flg1 = "L" Then

          If targetcell.Borders(xlEdgeLeft).LineStyle <> xlNone Then

             CurrentRow = CurrentRow + 1

          Else

            Exit For

          End If

      End If

      If flg1 = "R" Then

         If targetcell.Borders(xlEdgeRight).LineStyle <> xlNone Then

             CurrentRow = CurrentRow + 1

          Else

             Exit For

          End If

      End If

      If flg1 = "" Then Exit For

    Next

Else

    MsgBox "セルが選択されていません。"

    Exit Sub

End If

kb = 2    '右シフトを選択  kb=1 なら左シフト

Range(Cells(strow, stcol), Cells(CurrentRow, stcol)).Select

If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = xlNone      '罫線削除

If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = xlNone

If kb = 1 Then      '左シフトの場合

    Range(Cells(strow, stcol - 1), Cells(CurrentRow, stcol - 1)).Select

    If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = sen1

     If flg1 = "L" Then Selection.Borders(xlEdgeLeft).Weight = wht1

    If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = sen2

     If flg1 = "R" Then Selection.Borders(xlEdgeRight).Weight = wht2 '

Else          '右シフトの場合

   Range(Cells(strow, stcol + 1), Cells(CurrentRow, stcol + 1)).Select

   If flg1 = "L" Then Selection.Borders(xlEdgeLeft).LineStyle = sen1

    If flg1 = "L" Then Selection.Borders(xlEdgeLeft).Weight = wht1

   If flg1 = "R" Then Selection.Borders(xlEdgeRight).LineStyle = sen2

    If flg1 = "R" Then Selection.Borders(xlEdgeRight).Weight = wht2

End If

End Sub

 

Sub 図形名分割(図形名 As Variant)  'name3とnama2はpublic定義の必要あり

Dim ar5()

Dim i, leng1, leng2 As Long

Dim 結果

leng1 = Len(図形名)

Dim name1

For i = 1 To leng1

ReDim Preserve ar5(2, i)

ar5(1, i) = Mid(図形名, i, 1)

If IsNumeric(ar5(1, i)) Then

ar5(2, i) = 0

Else

ar5(2, i) = 1

End If

Next

 

leng2 = 0

For i = 1 To leng1

leng2 = leng2 + 1

If ar5(2, i) = 0 Then Exit For

Next

name1 = Left(図形名, leng2 - 2)

name2 = Right(図形名, leng1 - leng2 + 1)

name3 = dic_x(name1)

name3 = name3 & " " & name2

End Sub

 

Sub 配列作成()    '英文図形名を和文に変換する連想配列を作成する

Dim 図形名本体 As String, 図形名連番 As String

Dim ar11, ar12

Dim i As Long

'Dim dic_x As Object    'dic_x はグローバルまたはpublic変数として登録しておく

Set dic_x = CreateObject("scripting.dictionary")

 

ar11 = Array("Straight Connector", "Straight Arrow Connector", "Elbow Connector", "Curved Connector", "Freeform", _

"Rectangle", "Rounded Rectangle", "Snip Single Corner Rectangle", "Snip Same Side Corner Rectangle", "Snip Diagonal Corner Rectangle", _

"Snip and Round Single Corner Rectangle", "Round Single Corner Rectangle", "Round Same Side Corner Rectangle", _

"Round Diagonal Corner Rectangle", "TextBox", "Oval", "Isosceles Triangle", "Right Triangle", "Parallelogram", "Trapezoid ", "Diamond", _

"Regular Pentagon", "Hexagon", "Heptagon", "Octagon", "Decagon", "Dodecagon", "Pie", "Chord", "Teardrop", "Frame", "Half Frame", _

"L-Shape", "Diagonal Stripe", "Cross", "Plaque", "Can", "Cube", "Bevel", "Donut", "No Symbol", "Block Arc", "Folded Corner", "Smiley Face", _

"Heart", "Lightning Bolt", "Sun", "Moon", "Cloud", "Arc", "Double Bracket", "Double Brace", "Left Bracket", "Right Bracket", "Left Brace", _

"Right Brace", "Right Arrow", "Left Arrow", "Up Arrow", "Down Arrow", "Left-Right Arrow", "Up-Down Arrow", "Quad Arrow", _

"Left-Right-Up Arrow", "Bent Arrow", "U-Turn Arrow", "Left-Up Arrow", "Bent-Up Arrow", "Curved Right Arrow", "Curved Left Arrow", _

"Curved Up Arrow", "Curved Down Arrow", "Striped Right Arrow", "Notched Right Arrow", "Pentagon", "Chevron", "Right Arrow Callout", _

"Down Arrow Callout", "Left Arrow Callout", "Up Arrow Callout", "Left-Right Arrow Callout", "Quad Arrow Callout", "Circular Arrow", "Plus", "Minus", _

"Multiply", "Division", "Equal", "Not Equal", "Flowchart: Process", _

"Flowchart: Alternate Process", "Flowchart: Decision", "Flowchart: Data", "Flowchart: Predefined Process", "Flowchart: Internal Storage", _

"Flowchart: Document", "Flowchart: Multidocument", "Flowchart: Terminator", "Flowchart: Preparation", "Flowchart: Manual Input", _

"Flowchart: Manual Operation", "Flowchart: Connector", "Flowchart: Off-page Connector", "Flowchart: Card", "Flowchart: Punched Tape", _

"Flowchart: Summing Junction", "Flowchart: Or", "Flowchart: Collate", "Flowchart: Sort", "Flowchart: Extract", _

"Flowchart: Merge", "Flowchart: Stored Data", "Flowchart: Delay", "Flowchart: Sequential Access Storage", "Flowchart: Magnetic Disk", _

"Flowchart: Direct Access Storage", "Flowchart: Display", "Explosion 1", "Explosion 2", "4-Point Star", _

"5-Point Star", "6-Point Star", "7-Point Star", "8-Point Star", "10-Point Star", "12-Point Star", "16-Point Star", "24-Point Star", _

"32-Point Star", "Up Ribbon", "Down Ribbon", "Curved Up Ribbon", "Curved Down Ribbon", "Vertical Scroll", "Horizontal Scroll", _

"Wave", "Double Wave", "Double Wave", "Rounded Rectangular Callout", "Oval Callout", "Cloud Callout", "Line Callout 1", _

"Line Callout 2", "Line Callout 3", "Line Callout 1 (Accent Bar)", "Line Callout 2 (Accent Bar)", "Line Callout 3 (Accent Bar)", _

"Line Callout 1 (No Border)", "Line Callout 2 (No Border)", "Line Callout 3 (No Border)", "Line Callout 1 (Border and Accent Bar)", _

"Line Callout 2 (Border and Accent Bar)", "Line Callout 3 (Border and Accent Bar)", "Group")

 

ar12 = Array("直線コネクタ", "直線矢印コネクタ", "コネクタ: カギ線", "コネクタ: 曲線", "フリーフォーム: 図形", _

 "正方形/長方形", "四角形: 角を丸くする", "四角形: 1 つの角を切り取る", "四角形: 上の 2 つの角を切り取る", "四角形: 対角を切り取る", _

 "四角形: 1 つの角を切り取り 1 つの角を丸める", "四角形: 1 つの角を丸める", "四角形: 上の 2 つの角を丸める", "四角形: 対角を丸める", "テキスト ボックス", _

"楕円", "二等辺三角形", "直角三角形", "平行四辺形", "台形", _

"ひし形", "五角形", "六角形", "七角形", "八角形", "十角形", "十二角形", "部分円", "弦", "涙形", _

"フレーム", "フレーム (半分)", "L 字", "斜め縞", "十字形", "ブローチ", "円柱", "直方体", "四角形: 角度付き", "円: 塗りつぶしなし", _

"禁止マーク", "アーチ", "四角形: メモ", "スマイル", "ハート", "稲妻", "太陽", "月", "雲", "円弧", _

"大かっこ", "中かっこ", "左大かっこ", "右大かっこ", "左中かっこ", "右中かっこ", "矢印: 右", "矢印: 左", "矢印: 上", "矢印: 下", _

"矢印: 左右", "矢印: 上下", "矢印: 四方向", "矢印: 三方向", "矢印: 折線", "矢印: U ターン", "矢印: 二方向", "矢印: 上向き折線", "矢印: 右カーブ", "矢印: 左カーブ", _

"矢印: 上カーブ", "矢印: 下カーブ", "矢印: ストライプ", "矢印: V 字型", "矢印: 五方向", "矢印: 山形", "吹き出し: 右矢印", "吹き出し: 下矢印", "吹き出し: 左矢印", "吹き出し: 上矢印", _

"吹き出し: 左右矢印", "吹き出し: 四方向矢印", "矢印: 環状", "加算記号", "減算記号", "乗算記号", "除算記号", "次の値と等しい", "等号否定", "フローチャート: 処理", _

"フローチャート: 代替処理", "フローチャート: 判断", "フローチャート: データ", "フローチャート: 定義済み処理", "フローチャート: 内部記憶", "フローチャート: 書類", "フローチャート: 複数書類", "フローチャート: 端子", "フローチャート: 準備", "フローチャート: 手操作入力", _

"フローチャート: 手作業", "フローチャート: 結合子", "フローチャート: 他ページ結合子", "フローチャート: カード", "フローチャート: せん孔テープ", "フローチャート: 和接合", "フローチャート: 論理和", "フローチャート: 照合", "フローチャート: 分類", "フローチャート: 抜出し", _

"フローチャート: 組合せ", "フローチャート: 記憶データ", "フローチャート: 論理積ゲート", "フローチャート: 順次アクセス記憶", "フローチャート: 磁気ディスク", "フローチャート: 直接アクセス記憶", "フローチャート: 表示", "爆発: 8 pt", "爆発: 14 pt", "星: 4 pt", _

"星: 5 pt", "星: 6 pt", "星: 7 pt", "星: 8 pt", "星: 10 pt", "星: 12 pt", "星: 16 pt", "星: 24 pt", "星: 32 pt", "リボン: 上に曲がる", _

"リボン: 下に曲がる", "リボン: カーブして上方向に曲がる", "リボン: カーブして下方向に曲がる", "スクロール: 縦", "スクロール: 横", "波線", "小波", "吹き出し: 四角形", "吹き出し: 角を丸めた四角形", "吹き出し: 円形", _

"思考の吹き出し: 雲形", "吹き出し: 線", "吹き出し: 折線", "吹き出し: 2 つ折線", "吹き出し: 線 (強調線付き)", "吹き出し: 折線 (強調線付き)", "吹き出し: 2 つ折線 (強調線付き)", "吹き出し: 線 (枠なし)", "吹き出し: 折線 (枠なし)", "吹き出し: 2 つ折線 (枠なし)", _

"吹き出し: 線 (枠付き、強調線付き)", "吹き出し: 折線 (枠付き、強調線付き)", "吹き出し: 2 つ折線 (枠付き、強調線付き)", "グループ化")

'Range("g1:g200") = WorksheetFunction.Transpose(ar11)

'Range("h1:h200") = WorksheetFunction.Transpose(ar12)

For i = 1 To 154

If dic_x.Exists(ar11(i)) = False Then

dic_x.Add ar11(i), ar12(i)

Else

End If

Next

 

End Sub

Sub 範囲取得()   セル間比率

Dim range1 As Range

Dim ar1() As Double

 Dim t1, total2 As Double

    Dim stcol, edcol, i, strow, edrow As Long

      Dim a1, b1 As String

Dim rui, n, j As Long

 

Dim MaxRow As Long

MaxRow = Cells(Rows.Count, "A").End(xlUp).Row

ReDim ar1(MaxRow, 3)

rui = 0

n = UBound(ar1, 1)

For i = 1 To n

ar1(i, 1) = Cells(i, "A")

rui = rui + ar1(i, 1)

'rui = 分割比率の合計

ar1(i, 2) = rui

Next

 

'    ' 結果をメッセージボックスに表示(例)

'    MsgBox "選択された範囲: " & selectedRange.Address

Dim selectedRange As Range

    Dim topLeftCell As Range

    Dim bottomRightCell As Range

    ' 現在選択されている範囲を取得

    Set selectedRange = Selection

    ' 範囲の左上のセルを取得

    Set topLeftCell = selectedRange.Cells(1, 1)

    ' 範囲の右下のセルを取得

    Set bottomRightCell = selectedRange.Cells(selectedRange.Rows.Count, selectedRange.Columns.Count)

    ' 結果をメッセージボックスに表示(例)

'    MsgBox "左上のセル: " & topLeftCell.Address & vbCrLf & "右下のセル: " & bottomRightCell.Address

    a1 = topLeftCell.Address

    b1 = bottomRightCell.Address

    '左上の行と列を取得

    Range(a1).Select

    strow = Selection.Row

    stcol = Selection.Column

'    右下の行と列を取得

    Range(b1).Select

     edrow = Selection.Row

    edcol = Selection.Column

    For i = strow To edrow

    Cells(1, i).Select

    t1 = t1 + Selection.ColumnWidth

    Next

    Dim keisu As Double

    keisu = t1 / rui      '1分割比率あたりの幅

    MsgBox t1 & "  ggg  " & rui & "   " & keisu

    For i = 1 To n

    ar1(i, 3) = ar1(i, 2) * keisu

'    MsgBox ar1(i, 3)

    Next

'    Exit Sub

    For j = 1 To n

    total2 = 0

    For i = stcol To edcol

     Cells(1, i).Select

     total2 = total2 + Selection.ColumnWidth

     If total2 > ar1(j, 3) Then

        MsgBox ar1(j, 3)

        MsgBox Selection.Column

        Exit For

      End If

    Next

    Next

    selectedRange.Select

End Sub

 


Sub 図形追加()

'Left,Top,Width,Height

ActiveSheet.Shapes.AddShape(msoShapeRectangle, 160.2, 99, 115.2, 69.6).Select

'   正方形 / 長方形

    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 114.6, 148.8, 52.8 _

        , 32.4).Select        'テキスト ボックス 21

    ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, 125.4, 199.8, 66.6, 20.4) _

        .Select                  '四角形: 角を丸くする

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartOffpageConnector, 353.4, 207.6, _

        33.6, 34.2).Select    'フローチャート: 他ページ結合子

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartDocument, 455.4, 241.2, 53.4, 40.2 _

        ).Select               'フローチャート: 書類

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartMultidocument, 530.4, 216.6, 46.8 _

        , 49.8).Select      'ローチャート: 複数書類

    ActiveSheet.Shapes.AddShape(msoShapeFlowchartSummingJunction, 421.8, 290.4, _

        30.6, 25.8).Select        'フローチャート: 和接合 28

End Sub

図形の定率拡大/縮小

Private Sub CommandButton1_Click()

Dim shp As Shape

Dim per As Long

Dim ratio As Double

per = Val(TextBox1)

ratio = 1 + per / 100

Application.ScreenUpdating = False                'ディスプレイ出力抑止

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

If OptionButton1 = True Then

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

 Selection.ShapeRange.ScaleHeight ratio, msoFalse, msoScaleFromTopLeft

Else

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

End If

Next

Application.ScreenUpdating = True                'ディスプレイ出力

End Sub

 

Private Sub CommandButton2_Click()

Dim shp As Shape

Dim per As Long

Dim ratio  As Double

per = Val(TextBox1)

ratio = 1 / (1 + per / 100)

Application.ScreenUpdating = False                'ディスプレイ出力抑止

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

If OptionButton1 = True Then

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

 Selection.ShapeRange.ScaleHeight ratio, msoFalse, msoScaleFromTopLeft

Else

Selection.ShapeRange.ScaleWidth ratio, msoFalse, msoScaleFromTopLeft

End If

Next

Application.ScreenUpdating = True                'ディスプレイ出力

End Sub

 

Private Sub UserForm_Initialize()

OptionButton1 = True

End Sub


Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long) As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

Private Const GWL_STYLE = -16

Private Const WS_MAXIMIZEBOX = &H10000

Private Const WS_MINIMIZEBOX = &H20000

Private Const WS_THICKFRAME = &H40000

 

別フォームを呼び出すときに、自身を極小化する

Private Sub CommandButton3_Click()

Dim hWnd As LongPtr

hWnd = FindWindowA(vbNullString, "UF1")

ShowWindow hWnd, 6

UserForm1.Show vbModeless

End Sub

 

呼び出したフォームを終了するとき、元のフォームを拡大する

Private Sub CommandButton7_Click()

Dim hWnd As LongPtr

hWnd = FindWindowA(vbNullString, "UF1")

ShowWindow hWnd, 9

Unload Me

End Sub

xボタンを押させない

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    '×ボタンを押しても閉じない
    
    If CloseMode = 0 Then
        MsgBox "×ボタンで閉じないでください"
        Cancel = 1 '閉じる操作をキャンセル
    End If
End Sub

矢印の逆転

Sub CheckConnector矢印方向()

Dim shp As Shape

Dim A1, A2, A12 As String

    ' 選択されている図形のうち最初の図形を取得

For Each shp In Selection.ShapeRange

    ' 図形がコネクタであることを確認

    If shp.Name Like "*Connector*" Or shp.Name Like "*コネクタ*" Then

        ' コネクタの方向を判定

        If Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle Then

            A1 = "1"   '三角形

        ElseIf Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadStealth Then

            A1 = "2"      '矢印

        ElseIf Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadOpen Then

            A1 = "3"      '矢印線

        Else

            A1 = "4"      '開始印なし

        End If

        

        If Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle Then

            A2 = "1"

        ElseIf Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth Then

            A2 = "2"

        ElseIf Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen Then

            A2 = "3"

        Else

            A2 = "4"

        End If

    End If

    A12 = A1 & A2

    Select Case A12

        Case "41"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadTriangle

        Case "42"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadStealth

        Case "43"

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadOpen

        Case "14"

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle

        Case "24"

        Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth

        Case "34"

            Selection.ShapeRange.Line.BeginArrowheadStyle = msoArrowheadNone

            Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen

        Case Else

    End Select

    Exit Sub

Next

End Sub

 

 

 

多図形のサイズ変更時の重心移動

Option Base 1

Public ar1()

Public arx() As Double

Public ary() As Double

Public Lc As Long

Public ach As String

rivate Sub CommandButton1_Click()  '図形記憶

Dim shp As Shape

Dim ch As Long

Dim i As Long

Erase arx            '各図形のスペック配列

Erase ar1            '各図形の名前配列

Lc = 0                  '選択されている図形の数

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange    '選択されている図形の情報を順次取得

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(2, Lc) + (arx(4, Lc) / 2)    '左右の中心位置を求める

arx(6, Lc) = arx(1, Lc) + (arx(3, Lc) / 2)   '上下の中心位置を求める

Next

End Sub

 

Private Sub CommandButton2_Click()      '変更した図形の重心を元に戻す

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim H1() As Long

Dim L1() As Long

Dim ar2(1)

ReDim H1(Lc)

ReDim L1(Lc)

ReDim Preserve ary(6, Lc)

For i = 1 To Lc

ar2(1) = ar1(i)            '図形を選択するために 引数を配列にする必要がある

On Error Resume Next

Err.Clear

ActiveSheet.Shapes.Range(ar2).Select

If Err.Number <> 0 Then

MsgBox "図形が削除されています"

Err.Clear

Exit Sub

End If

For Each shp In Selection.ShapeRange  '拡大/縮小した図形の把握

ary(1, i) = shp.Top

ary(2, i) = shp.Left

ary(3, i) = shp.Height

ary(4, i) = shp.Width

ary(5, i) = ary(2, i) + (ary(4, i) / 2)

ary(6, i) = ary(1, i) + (ary(3, i) / 2)

Next

'シフト量算出

L1(i) = (arx(5, i) - ary(5, i))

H1(i) = (arx(6, i) - ary(6, i))

Selection.ShapeRange.IncrementLeft L1(i)      '左右の位置を補正

Selection.ShapeRange.IncrementTop H1(i)      '上下の位置を補正

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

Private Sub CommandButton3_Click()      'センタリング

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim av1 As Double

Dim ar2(1)

Dim L1() As Long

Erase arx

Erase ar1

Lc = 0

On Error Resume Next

For Each shp In Selection.ShapeRange

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(2, Lc) + (arx(4, Lc) / 2)      '図形の左右中心

Next

ReDim L1(Lc)

'センタリング

'図形の左右中心の平均値を求める

For i = 1 To Lc

av1 = av1 + arx(5, i)

Next

av1 = av1 / Lc

'各図形をセンタリングするために中心医師(av)との差を求める

For i = 1 To Lc

L1(i) = av1 - arx(5, i)

'ReDim ary(6, Lc)

ar2(1) = ar1(i)

ActiveSheet.Shapes.Range(ar2).Select

'

Selection.ShapeRange.IncrementLeft L1(i)

Next

ActiveSheet.Shapes.Range(ar1).Select

 

End Sub

Private Sub CommandButton4_Click()      '左寄せ

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim av1 As Double

Dim ar2(1)

Dim L1() As Long

Erase arx

Erase ar1

Lc = 0

On Error Resume Next

For Each shp In Selection.ShapeRange

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ReDim Preserve arx(6, Lc)

ar1(Lc) = shp.Name

arx(1, Lc) = shp.Top

arx(2, Lc) = shp.Left

arx(3, Lc) = shp.Height

arx(4, Lc) = shp.Width

arx(5, Lc) = arx(1, Lc) + (arx(3, Lc) / 2)      '図形の左右中心

Next

ReDim L1(Lc)

'左寄せ

'図形の左端最低値を求める

av1 = arx(5, 1)

For i = 1 To Lc

If arx(5, i) < av1 Then

av1 = arx(5, i)

End If

Next

'各図形をセンタリングするために中心医師(av)との差を求める

For i = 1 To Lc

L1(i) = av1 - arx(2, i)

'ReDim ary(6, Lc)

ar2(1) = ar1(i)

ActiveSheet.Shapes.Range(ar2).Select

Selection.ShapeRange.IncrementLeft L1(i)

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

Private Sub CommandButton5_Click()

Dim shp As Shape

Dim ch As Long

Dim i As Long

Dim H1() As Long

Dim L1() As Long

Dim ar2(1)

ReDim H1(Lc)

ReDim L1(Lc)

For i = 1 To Lc

 

ReDim Preserve ary(6, Lc)

ar2(1) = ar1(i)

On Error Resume Next

 

ActiveSheet.Shapes.Range(ar2).Select

'If Error Then

'MsgBox "図形が削除されています"

'Exit Sub

'End If

 

'For Each shp In Selection.ShapeRange

ary(1, i) = arx(1, i)

ary(2, i) = arx(2, i)

ary(3, i) = arx(3, i)

ary(4, i) = arx(4, i)

'ary(5, i) = ary(2, i) + (ary(4, i) / 2)

'ary(6, i) = ary(1, i) + (ary(3, i) / 2)

'Next

'シフト量算出

'L1(i) = (arx(5, i) - ary(5, i))

'H1(i) = (arx(6, i) - ary(6, i))

MsgBox ary(1, 1)

Selection.ShapeRange.IncrementTop (ary(1, i) * -1)

 

Selection.ShapeRange.IncrementLeft (ary(2, i) * -1)

Selection.ShapeRange.Height ary(3, i)

Selection.ShapeRange.Width ary(4, i)

Next

ActiveSheet.Shapes.Range(ar1).Select

End Sub

 

***************************************************************************************

ar1とlcはpublic宣言しておく  リストボックスを使ったセルの選択

Private Sub UserForm_Initialize()

Dim hwnd As LongPtr

hwnd = FindWindow("ThunderDFrame", Me.Caption)

SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) Or &H70000

End Sub

Private Sub cm1_Click()   '図形の個別選択を記憶、リストボックス表示

Dim shp As Shape

Dim ch As Long

Dim i As Long

On Error Resume Next

If VarType(Selection) = vbObject Then

    Else

       MsgBox "図形は選択されていせん。"

    Exit Sub

  End If

For Each shp In Selection.ShapeRange

With UF1.ListBox1

.AddItem ""

.List(Lc, 0) = shp.Name

Lc = Lc + 1

ReDim Preserve ar1(Lc)

ar1(Lc) = shp.Name

End With

Next

End Sub

Private Sub cm2_Click()      '記憶した図形を選択状態にする

If (Not ar1) = -1 Then

MsgBox "何も選択されていません"

Else

ActiveSheet.Shapes.Range(ar1).Select

End If

End Sub

Private Sub ListBox1_Click()    'リストボックスをクリックしたとき、その図形を選択

Dim ar2(1)

Dim i As Long

With UF1.ListBox1

i = UF1.ListBox1.ListIndex

ar2(1) = ar1(i + 1)

ActiveSheet.Shapes.Range(ar2).Select

End With

End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)

Dim ar2(1)

Dim i, k As Long

With UF1.ListBox1

k = UF1.ListBox1.ListIndex

For i = k + 2 To UBound(ar1)

ar1(i - 1) = ar1(i)

Next i

'■配列を再定義し、最終の要素を詰める

ReDim Preserve ar1(UBound(ar1) - 1)

Lc = Lc - 1

For i = ListBox1.ListCount - 1 To 0 Step -1

If ListBox1.Selected(k) Then

ListBox1.RemoveItem (k)

Exit For

End If

Next

End With

End Sub

Private Sub CommandButton1_Click()  'リストボックスのクリア

ListBox1.Clear

Lc = 0

Erase ar1

Range("A1").Select

End Sub

Private Sub CommandButton2_Click()  'リストの重複削除

Dim dic_1 As Object

Dim ar3()

Dim i, k As Long

If (Not ar1) = -1 Then

MsgBox "何も選択されていません"

Else

Set dic_1 = CreateObject("Scripting.Dictionary")

For i = 1 To UBound(ar1)

If dic_1.Exists(ar1(i)) = False Then

dic_1.Add ar1(i), i

k = k + 1

ReDim Preserve ar3(k)

ar3(k) = ar1(i)

End If

Next

Erase ar1

ar1 = ar3

ListBox1.Clear

Lc = 0

For i = 1 To UBound(ar1)

With UF1.ListBox1

.AddItem ""

.List(i - 1, 0) = ar1(i)

Lc = Lc + 1

End With

Next

End If

End Sub

 

 

ユーザーフォームをアンダーバーで小さくする方法

フォームモジュールに追加します

Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr

Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long) As Long

Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long

 

Private Sub UserForm_Initialize()

Dim hwnd As LongPtr

hwnd = FindWindow("ThunderDFrame", Me.Caption)

SetWindowLong hwnd, -16, GetWindowLong(hwnd, -16) Or &H70000

End Sub

フォームをxで閉じようとしたとき

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        MsgBox "[閉じる]ボタンを使用してください"
        Cancel = True
    End If
End Sub

Sub 図形接続線描画()

'実行前に2つの図を選択しておく必要があります

Dim shp_n As String

Dim shp_ary(2)

Dim n1, n2, i As Long

Dim shp  As Shape

Dim shv(2)  As Shape

Dim sh_1 As String

Dim sh_2 As String

Dim top_ary(2) As Double

Dim base_flg As Long

Dim hx(2) As Integer

Dim hen, knd, y_mark As String

 

'外部変数入力 1 = 上下 2 = 左右

hen = InputBox("上か左右か")

knd = InputBox("カギか直線か曲線か")

y_mark = InputBox("三角、鋭角、線")

On Error Resume Next

hx(0) = 1    '配列インデックス0に代入してエラーが起きるかどうか確かめる

If Err.Number <> 0 Then  '  エラーが出たらoptionbase 指定がされている

    base_flg = 1

Else

    base_flg = 0

End If

With ActiveSheet

On Error GoTo err1

If Selection.ShapeRange.Count > 1 Then

    For Each shp In Selection.ShapeRange

        i = i + 1

        shp_ary(i) = shp.Name   '図形名を記憶する

       

        If Val(hen) = 1 Then

            top_ary(i) = shp.Top      '図形の位置関係を確認するため高さまたは左からの位置を取得する

        Else

            top_ary(i) = shp.Left

        End If

    Next

    If i > 2 Then

        MsgBox "図形が3つ以上選択されています"

        Exit Sub

    End If

Else      '図形が選択されていなかった場合

err1:

    Err.Clear

    MsgBox "図形が2つ選択されていません"

    Exit Sub

End If

End With

 

On Error Resume Next    '矢印の方向を決めるため上(左)の図形名称を決定する

If top_ary(1) < top_ary(2) Then

    sh_1 = shp_ary(1)

    sh_2 = shp_ary(2)

Else

    sh_1 = shp_ary(2)

    sh_2 = shp_ary(1)

End If

 

Select Case Val(knd)

    Case 1

        ActiveSheet.Shapes.AddConnector(msoConnectorElbow, 10, 10, 10, 10).Select

        '罫線で図形を連結する場合にはそのサイズは問わない

    Case 2

        ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 10, 10, 10, 10).Select

    Case Else

        ActiveSheet.Shapes.AddConnector(msoConnectorCurve, 10, 10, 10, 10).Select

End Select

shp_n = Selection.Name

Selection.Name = changeEngToJpn(shp_n)

'矢印の種類を決める

Select Case Val(y_mark)

    Case 1

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadTriangle

    Case 2

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadStealth

    Case Else

        Selection.ShapeRange.Line.EndArrowheadStyle = msoArrowheadOpen

End Select

'罫線接続変数を決める 1=図形上中央 2=左中央 3=下中央 4=右中央

If Val(hen) = 1 Then    '上下接続か、左右接続か

   n1 = 3          '上(左)の図形の接続点

   n2 = 1           '下(右)の図形の接続点

Else

  n1 = 4

  n2 = 2

End If

'接続線の描画

Selection.ShapeRange.ConnectorFormat.BeginConnect ActiveSheet.Shapes(sh_1), n1

Selection.ShapeRange.ConnectorFormat.EndConnect ActiveSheet.Shapes(sh_2), n2

'最初選んでいた図形を選びなおす

ActiveSheet.Shapes.Range(Array(shp_ary(1), shp_ary(2))).Select

End Sub

図形の英文を和文に変更

Public Function changeEngToJpn(変換対象 As String) As String

Dim 図形名本体 As String, 図形名連番 As String

Dim 図形名英文配列 As Variant, 図形名和文配列 As Variant, st_buf() As String

Dim id As Integer

Dim hx(2) As Integer

Dim opflg As Long

On Error Resume Next

    hx(0) = 1    'エラーが起きる

' モジュールのコードを取得

 If Err.Number <> 0 Then

       opflg = 0

    Else

        ' Option Baseステートメントが見つからなかった場合(デフォルトはOption Base 0)

       opflg = -1

End If

Err.Clear

Const iMax As Integer = 39  '固定長の長さ

    図形名英文配列 = Array("Straight Connector                     001", "Straight Arrow Connector               002", "Elbow Connector                        003", "Curved Connector                       004", "Freeform                               005", "Rectangle                              006", "Rounded Rectangle                      007", "Snip Single Corner Rectangle           008", "Snip Same Side Corner Rectangle        009", "Snip Diagonal Corner Rectangle         010", _

        "Snip and Round Single Corner Rectangle 011", "Round Single Corner Rectangle          012", "Round Same Side Corner Rectangle       013", "Round Diagonal Corner Rectangle        014", "TextBox                                015", "Oval                                   016", "Isosceles Triangle                     017", "Right Triangle                         018", "Parallelogram                          019", "Trapezoid                              020", _

        "Diamond                                021", "Regular Pentagon                       022", "Hexagon                                023", "Heptagon                               024", "Octagon                                025", "Decagon                                026", "Dodecagon                              027", "Pie                                    028", "Chord                                  029", "Teardrop                               030", _

        "Frame                                  031", "Half Frame                             032", "L-Shape                                033", "Diagonal Stripe                        034", "Cross                                  035", "Plaque                                 036", "Can                                    037", "Cube                                   038", "Bevel                                  039", "Donut                                  040", _

        "No Symbol                              041", "Block Arc                              042", "Folded Corner                          043", "Smiley Face                            044", "Heart                                  045", "Lightning Bolt                         046", "Sun                                    047", "Moon                                   048", "Cloud                                  049", "Arc                                    050", _

        "Double Bracket                         051", "Double Brace                           052", "Left Bracket                           053", "Right Bracket                          054", "Left Brace                             055", "Right Brace                            056", "Right Arrow                            057", "Left Arrow                             058", "Up Arrow                               059", "Down Arrow                             060", _

        "Left-Right Arrow                       061", "Up-Down Arrow                          062", "Quad Arrow                             063", "Left-Right-Up Arrow                    064", "Bent Arrow                             065", "U-Turn Arrow                           066", "Left-Up Arrow                          067", "Bent-Up Arrow                          068", "Curved Right Arrow                     069", "Curved Left Arrow                      070", _

        "Curved Up Arrow                        071", "Curved Down Arrow                      072", "Striped Right Arrow                    073", "Notched Right Arrow                    074", "Pentagon                               075", "Chevron                                076", "Right Arrow Callout                    077", "Down Arrow Callout                     078", "Left Arrow Callout                     079", "Up Arrow Callout                       080", _

        "Left-Right Arrow Callout               081", "Quad Arrow Callout                     082", "Circular Arrow                         083", "Plus                                   084", "Minus                                  085", "Multiply                               086", "Division                               087", "Equal                                  088", "Not Equal                              089", "Flowchart: Process                     090", _

        "Flowchart: Alternate Process           091", "Flowchart: Decision                    092", "Flowchart: Data                        093", "Flowchart: Predefined Process          094", "Flowchart: Internal Storage            095", "Flowchart: Document                    096", "Flowchart: Multidocument               097", "Flowchart: Terminator                  098", "Flowchart: Preparation                 099", "Flowchart: Manual Input                100", _

        "Flowchart: Manual Operation            101", "Flowchart: Connector                   102", "Flowchart: Off-page Connector          103", "Flowchart: Card                        104", "Flowchart: Punched Tape                105", "Flowchart: Summing Junction            106", "Flowchart: Or                          107", "Flowchart: Collate                     108", "Flowchart: Sort                        109", "Flowchart: Extract                     110", _

        "Flowchart: Merge                       111", "Flowchart: Stored Data                 112", "Flowchart: Delay                       113", "Flowchart: Sequential Access Storage   114", "Flowchart: Magnetic Disk               115", "Flowchart: Direct Access Storage       116", "Flowchart: Display                     117", "Explosion 1                            118", "Explosion 2                            119", "4-Point Star                           120", _

        "5-Point Star                           121", "6-Point Star                           122", "7-Point Star                           123", "8-Point Star                           124", "10-Point Star                          125", "12-Point Star                          126", "16-Point Star                          127", "24-Point Star                          128", "32-Point Star                          129", "Up Ribbon                              130", _

        "Down Ribbon                            131", "Curved Up Ribbon                       132", "Curved Down Ribbon                     133", "Vertical Scroll                        134", "Horizontal Scroll                      135", "Wave                                   136", "Double Wave                            137", "Rectangular Callout                    138", "Rounded Rectangular Callout            139", "Oval Callout                           140", _

        "Cloud Callout                          141", "Line Callout 1                         142", "Line Callout 2                         143", "Line Callout 3                         144", "Line Callout 1 (Accent Bar)            145", "Line Callout 2 (Accent Bar)            146", "Line Callout 3 (Accent Bar)            147", "Line Callout 1 (No Border)             148", "Line Callout 2 (No Border)             149", "Line Callout 3 (No Border)             150", _

        "Line Callout 1 (Border and Accent Bar) 151", "Line Callout 2 (Border and Accent Bar) 152", "Line Callout 3 (Border and Accent Bar) 153", "Group                                  154")

    If InStrRev(変換対象, " ") = 0 Then    '連番が付番されていない場合

        図形名本体 = 変換対象

        図形名連番 = ""

    Else                                                      '連番が付番されてる場合 本体名と 連番に切り離す

        図形名本体 = Mid(変換対象, 1, InStrRev(変換対象, " ") - 1)  '図形名

        図形名連番 = Mid(変換対象, InStrRev(変換対象, " "))  '半角スペース+連番

    End If

    図形名本体 = 図形名本体 & Space(iMax - Len(図形名本体))  '固定長にする 設定最大文字数から本体文字数を引いて その差数の スペースを付加

    st_buf = Filter(図形名英文配列, 図形名本体)  'Filterは結果を配列で返す 図形名英文配列が無駄に長いのは、部分位置でフィルターにかからないため

    If UBound(st_buf) <> -1 Then                'option base 1 の時は 0

    id = Replace(st_buf(0), 図形名本体, "") + opflg  '添え字を取得   'option base 1 の時は 0

                                                                           '添え字を取得   'option base 1 の設定がされていない時 -1

    図形名和文配列 = Array("直線コネクタ", "直線矢印コネクタ", "コネクタ: カギ線", "コネクタ: 曲線", "フリーフォーム: 図形", "正方形/長方形", "四角形: 角を丸くする", "四角形: 1 つの角を切り取る", "四角形: 上の 2 つの角を切り取る", "四角形: 対角を切り取る", _

    "四角形: 1 つの角を切り取り 1 つの角を丸める", "四角形: 1 つの角を丸める", "四角形: 上の 2 つの角を丸める", "四角形: 対角を丸める", "テキスト ボックス", "楕円", "二等辺三角形", "直角三角形", "平行四辺形", "台形", _

            "ひし形", "五角形", "六角形", "七角形", "八角形", "十角形", "十二角形", "部分円", "弦", "涙形", _

            "フレーム", "フレーム (半分)", "L 字", "斜め縞", "十字形", "ブローチ", "円柱", "直方体", "四角形: 角度付き", "円: 塗りつぶしなし", _

            "禁止マーク", "アーチ", "四角形: メモ", "スマイル", "ハート", "稲妻", "太陽", "月", "雲", "円弧", _

            "大かっこ", "中かっこ", "左大かっこ", "右大かっこ", "左中かっこ", "右中かっこ", "矢印: 右", "矢印: 左", "矢印: 上", "矢印: 下", _

            "矢印: 左右", "矢印: 上下", "矢印: 四方向", "矢印: 三方向", "矢印: 折線", "矢印: U ターン", "矢印: 二方向", "矢印: 上向き折線", "矢印: 右カーブ", "矢印: 左カーブ", _

            "矢印: 上カーブ", "矢印: 下カーブ", "矢印: ストライプ", "矢印: V 字型", "矢印: 五方向", "矢印: 山形", "吹き出し: 右矢印", "吹き出し: 下矢印", "吹き出し: 左矢印", "吹き出し: 上矢印", _

            "吹き出し: 左右矢印", "吹き出し: 四方向矢印", "矢印: 環状", "加算記号", "減算記号", "乗算記号", "除算記号", "次の値と等しい", "等号否定", "フローチャート: 処理", _

            "フローチャート: 代替処理", "フローチャート: 判断", "フローチャート: データ", "フローチャート: 定義済み処理", "フローチャート: 内部記憶", "フローチャート: 書類", "フローチャート: 複数書類", "フローチャート: 端子", "フローチャート: 準備", "フローチャート: 手操作入力", _

            "フローチャート: 手作業", "フローチャート: 結合子", "フローチャート: 他ページ結合子", "フローチャート: カード", "フローチャート: せん孔テープ", "フローチャート: 和接合", "フローチャート: 論理和", "フローチャート: 照合", "フローチャート: 分類", "フローチャート: 抜出し", _

            "フローチャート: 組合せ", "フローチャート: 記憶データ", "フローチャート: 論理積ゲート", "フローチャート: 順次アクセス記憶", "フローチャート: 磁気ディスク", "フローチャート: 直接アクセス記憶", "フローチャート: 表示", "爆発: 8 pt", "爆発: 14 pt", "星: 4 pt", _

            "星: 5 pt", "星: 6 pt", "星: 7 pt", "星: 8 pt", "星: 10 pt", "星: 12 pt", "星: 16 pt", "星: 24 pt", "星: 32 pt", "リボン: 上に曲がる", _

            "リボン: 下に曲がる", "リボン: カーブして上方向に曲がる", "リボン: カーブして下方向に曲がる", "スクロール: 縦", "スクロール: 横", "波線", "小波", "吹き出し: 四角形", "吹き出し: 角を丸めた四角形", "吹き出し: 円形", _

            "思考の吹き出し: 雲形", "吹き出し: 線", "吹き出し: 折線", "吹き出し: 2 つ折線", "吹き出し: 線 (強調線付き)", "吹き出し: 折線 (強調線付き)", "吹き出し: 2 つ折線 (強調線付き)", "吹き出し: 線 (枠なし)", "吹き出し: 折線 (枠なし)", "吹き出し: 2 つ折線 (枠なし)", _

            "吹き出し: 線 (枠付き、強調線付き)", "吹き出し: 折線 (枠付き、強調線付き)", "吹き出し: 2 つ折線 (枠付き、強調線付き)", "グループ化")

        changeEngToJpn = 図形名和文配列(id) & 図形名連番

    Else

        changeEngToJpn = 変換対象

    End If

End Function

Public Sub font取得()

   Dim itm As Object

  Const CSIDL_FONTS = 20

  Dim arry1()

   Dim i As Long

   

   With CreateObject("Shell.Application").Namespace(CSIDL_FONTS)

    For Each itm In .Items

    i = i + 1

    ReDim Preserve arry1(i)

       arry1(i) = .GetDetailsOf(itm, 8)

    Next

  End With

  Range("M1").Resize(i, 1) = WorksheetFunction.Transpose(arry1)

End Sub

IF文の基本形

 

条件を満たさなかったときには何もしない

IF  CELLS(1,1) = 1 THEN 

 CELLS(1,2) = 2

ENDIF

 

または

IF  CELLS(1,1) = 1 THEN  CELLS(1,2) = 2

 

条件を満たさなかったときに別の処理をする

IF  CELLS(1,1) = 1 THEN 

 CELLS(1,2) = 2

ELSE

 CELLS(1,2) = 3

ENDIF

 

複数の条件で処理を変える(Ifnのネスト構造)

例:食べ放題の料金算出 A列性別 B列年齢 C列料金

IF  CELLS(1,"A") = "男"  THEN

  if  Cells(1,"B")  > 15 Then

          Cells(1,"C") = 2800

    else

          Cells(1,"C") = 1000

    End if

Else

    if  Cells(1,"B")  > 15 Then

          Cells(1,"C") = 2300

    else

          Cells(1,"C") = 800

    End if

End if

 

Ifには複合条件(or and)も設定できますが

余事象(else)の条件が読み取りにくくなったり

条件の設定漏れが発生することに注意しなければいけません。

 

またExcelSheetと違い、VBAのIFは処理の分岐にも使用します

例:If cells(i,1) = "" then Exit Sub

取得したセルの値がNullならば、処理を終了する

 

比較対象が文字の時は "" でくくる

例:IF  CELLS(1,1) = "A" THEN  CELLS(1,2) = 2

 

IF の代表的な比較演算子

=、>、<、>=、<=、<> (≠)

比較演算子だけではなく、結果がTrueがFalseの値を返してくれる関数はすべて使えます

代表例

If Cells(1,1) Like *AB*   Then ~   ABを含むならば

If Left(cells(1,1),2) = "AB" Then ~  ABではじまるならば

LeftはExcel関数をそのまま使えますが、使えない関数もあります

If WorksheetFunction.RoundUp(Cells(1, 1), 0) = 10 Then 

またVBAとExcelでは異なる関数もあります

Excel :=TEXT(A2,""yyyymmdd")

VBA   :Cells(2, 2) = Format(Cells(1, 1), "yyyymmdd")

 

比較文は 意味のない式は全て True になり 型が違うと全て Falseになる

If Cells(1, 1) = 100 Or 200 Then MsgBox "true" 

    (文法に沿っていないので全てTrue)

If Cells(1, 1) = 100 Then msgbox  "true" 

      (cells(1,1) が "100"ならば False

Excelシートで日付を見たら親の仇だと思え

   Excel シートの日付は VBAでは内部的に浮動小数点付き少数として扱われます。

     ⇒Format関数で文字列型に変換して使用しなければいけないケースが多々あります。

          日付型に使う関数と数字型に使う関数は全く別で VBAで日付を扱う時は

   日付用関数を使用しなければいけませんが、他の場所で使用するときは文字型に変換

      例 Cells(1, 2) = DateAdd("d", 3, Cells(1, 1))

        Excel では日付型に加算すると無条件に【日】が追加されますが

        VBAでは専用の関数が用意されています。

  

ExcelシートとVBAでは【型】の考えが全く違います

   Excelシート ⇒ 見え型

   ExcelVBA     ⇒ 型

 たおえば Cells(3,3) をシート上 文字列に設定します

   100 を 記入します ⇒ 100

   100 * 2 を記入します ⇒ 100*2 と表示されます

   ところが cells(3,4) に cells(3,3) * 2 と入れると 200 と表示されます

   ⇒ そのセルでは文字列型でも計算に使うと数字型として扱われます

   VBAで cells(3,4) = cells(3,3)  * 2 を実行するとエラーになります  ’型が一致しません'

 

まとめると

 If文を使いこなすには

  (1)If文そのものの文法を覚える

  (2)If文は必ず条件の評価(True or False)が伴うので

    比較演算子と関数を使えるようにします

  (3)比較演算子や関数は使用する項目の【型】に依存するので

    変数やセルの値の【型】を意識する必要があります

  (4)扱いたい変数やセルが期待した型でないときは、関数を使って

    (値を変えないまま)型を変更する技術が必要になります

 

Sub TEST1()

Dim ws As Worksheet

Dim i, MaxRow As Long

Dim MyDir, sh_name, NextexPath  As String

MyDir = ActiveWorkbook.Path

Sheets("Sheet1").Range("C:C").Copy Sheets("Sheet2").Range("A:A")

Sheets("Sheet2").Range("A:A").RemoveDuplicates Columns:=Array(1), Header:=xlYes

MaxRow = Sheets("Sheet2").Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To MaxRow

sh_name = Sheets("Sheet2").Cells(i, 1).Value

On Error Resume Next

Application.DisplayAlerts = False

Sheets(sh_name).Delete

Application.DisplayAlerts = True

Error.Clear

Next

For i = 2 To MaxRow

   Sheets("Sheet1").Select

   sh_name = Sheets("Sheet2").Cells(i, 1).Value

   Sheets("Sheet1").Copy After:=Sheets(Sheets.Count)

   Set ws = ActiveSheet

    ws.Name = sh_name

    If ActiveSheet.AutoFilterMode Then

    Else

    Rows("1:1").Select

    Selection.AutoFilter

    End If

  ws.Range("A1:E" & MaxRow).AutoFilter Field:=3, Criteria1:=sh_name

  NextexPath = MyDir & "\" & sh_name & ".pdf"

    ws.ExportAsFixedFormat _

        Type:=xlTypePDF, _

        Filename:=sh_name

 

ThisWorkbook.ExportAsFixedFormat _

        Type:=xlTypePDF, _

         filename:=exPath

 

  Next

End Sub


Private Sub UserForm_Initialize()   StartUpPosition =  00'手動

  Me.Left =  100

  Me.Top =   100
  'startupposition = 1 'Excelの中央   'startupposition = 2 '画面の中央   'startupposition = 3 '画面の左上 End Sub

For 文の基本

For文について述べる前に、VBAの特徴について

 

最初から極論ですが 、vbaには 一つの命令で一つのセルの値を

書き換えることしかできません。

そして、その一つのセルの位置を決めるために1つ以上の命令を使うことが

多々あります。

 

Excl関数がたくさん入っているシートは、どおかのセルの値が変更されると

(瞬時に)関係する他のセルの表示を変えることができます。

 

それに比べてVBAはマクロを実行しないとセルの値は変更されません。

またセルの中を覗いても(関数と違って)どうしてその値になっているかもわかりません。

 

一般には VBA > Excel関数  = VBAできるほうが関数使える人のほうがエライ

という先入観があるかもしれませんが

 

【計算】に関し絵は Excel関数 > VBA なのです

まあ関数でやると式が複雑すぎて解析できないというような例外もありますが。

 

VBAが関数より使いやすい点は

最終的に作りたい表の形式が一定でない場合(抽出や列の編集)、表と表の突合せや統合

小計だけを取り出す(ピポッドテーブル的な処理)

そして強力な編集機能です。(残業明細、給与基本データ、その他のデータから給与支給明細とか銀行別振込依頼書尾を作るなど)

一方メンバーとか要素が決まっている場合(生徒別科目別得点から各種順位や偏差値を計算する)などの場合関数のほうが有利となります。

 

ただ、どちらが優位かというのはVBAの基本機能(当然関数の基本機能も)わかっていないと判断できません。

 

その判断の基準となり大きな要素がIF文と、これから説明するFor文です

 

for文というのはいろいろな所で使われますが

最大(最頻といってもよいかも)昨日は

『1セルずつしか算出できないVBAの機能に対して』

【最初にどのセルに書き込むか】

【次回以降どセルに書き込むか】

【どのせるまで書き込んで処理を終了するか】

のコントロールにかかわるということです。

 

今までの例文では常に書き込む(セルに値を代入する)位置は固定でした。

cells(1,1)とか、これでは10行あるデータには10行の命令を作らなくてはいけません。

まして、何行あるか変動する場合、プログラミングのしようがありません。

 

そこで一般的な(あくまで一般的な)VBAプログラミングでは次のような手順をとります。

1.正規系のデータを作る(見出しとデータをセットで作る、key項目を決める、表と表の関係性

 が成立する場合、成立しない場合の条件、処理を決めておく)

 (これは最初あまり気にする必要はないです。ケースバイケースで場当たり的に決める場合も多いです)

2.元データと別のところに結果を編集する表を作成する

  (VBAは一度編集作業をすると、元の表はなくなってしまうから)

 この処理の中には、前回の算出結果をクリアーする も含まれます

3.対象範囲や算出範囲を決める。

4.その範囲を網羅するシナリオ(手順)を作成する

5.4.をもとに具体的なfor文を作成する。インデックスを決める。

6.for文を作成する

 

逆な言い方をすると、最終的に作りたい表をイメージして

1.その行は元データと同じか (抽出と編集 1行を2行にするというような場合も)

2.シートをコピーする

3.最終的に表示したい行を項目(列)は何か決めて抽出する

 (そのあとの手順と並行して実行する場合もあります)

 

3.見た目の表の始終業を、具体的な数字に置きなおすす

 開始行を決める

VBA(Visual Basic for Applications)の"For...Next"ステートメントは、指定された回数だけコードブロックを繰り返し実行するための機能です。以下に、VBAの"For...Next"ステートメントについて理解するための教材の例をご紹介します。

 

ループの基本構文:

VBAの"For...Next"ステートメントは、以下のような基本的な構文を持ちます。

 

vba

Copy code

For [カウンター変数] = [初期値] To [終了値] [Step [ステップ値]]

    ' 実行したいコード

Next [カウンター変数]

カウンター変数はループの回数をカウントするための変数であり、初期値から終了値までステップ値ごとに増加または減少します。ステップ値は省略可能で、指定しない場合はデフォルトで1となります。

 

単純なループの例:

 

vba

Copy code

Sub SimpleLoopExample()

    Dim i As Integer

    For i = 1 To 5

        MsgBox "現在の値は " & i & " です。"

    Next i

End Sub

この例では、変数iが1から5までの範囲で1ずつ増加し、各回でメッセージボックスが表示されます。

 

ステップ値を指定する例:

 

vba

Copy code

Sub StepValueExample()

    Dim i As Integer

    For i = 10 To 1 Step -2

        MsgBox "現在の値は " & i & " です。"

    Next i

End Sub

この例では、変数iが10から1まで2ずつ減少し、各回でメッセージボックスが表示されます。

 

これらの例を通じて、VBAの"For...Next"ステートメントの基本的な使い方を理解できると思います。さらに、実際のプロジェクトや課題に応じて応用的な使い方