[[20230502142747]] 『セル内の、改行「 vbLf 」と戦う...マクロ!!』(あみな) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『セル内の、改行「 vbLf 」と戦う...マクロ!!』(あみな)

 お世話になっております。									
「 Excel VBA 」の初心者( ぴょぴょ ) です。									
 まだ、空が飛べないです。宜しくお願いします。 (o_ _)o   									

 長文になりますので、お手すきの際に閲覧ください。									
 推定時間( 10分 )									

 セル内に複数の改行のある、縦型カレンダーがあります。									
 上記は、私が実際に業務で使用する物ではありません。									
 マクロの練習用に、自己課題として取り組んだ次第です。									

 ※ 質問掲示板への投稿									
[[20230417150547]] 『改行データに対応するコードを受動で入力したい。』(さまよえるたましい。)									

 さまよえるたましい。さんと、ほぼ同じ内容になっておりますが									
 関数での解決ではなく、VBAで処理をするのが課題です。									
 尚、レイアウトは自己課題を追加して、一部変更した内容となります。									

 マクロは...概ね完成しておりますが、一部だけどうしても									
 上手く行かない箇所がありまして、ご指導いただきたく思っております。									

 まずは、レイアウトのイメージをご確認ください。									
 尚、上手く行かない箇所は、後ほど説明をさせていただきます。									

 ※ シートのレイアウトについて									
'**************************************************************************************									
 【 Sheet1 】レイアウト一部抜粋									

    |[A] |[B] |[C]             |[D]   |[E] 									
 [1]|2023|   4|月              |EASY版 									
 [2]									
 [3]|日付|曜日|イベント内容    |コード|担当									
 '----------------------------------------------									
 [4]|  1 | 土 |データ抽出10日分|E0100 |三浦									
    |    |    |データ送信      |A0100 |鈴木									
    |    |    |通知作成        |            ←C4セルがここまで改行の意味									
 '----------------------------------------------

 *C列同様に、「 D列、E列 」も改行してデータを、別シートから反映します。									
 *イベント内容の名前に適応する、「 コード、担当者名 」を改行して別シート									
   から反映させるマクロとなります。									

 【 Sheet2 】レイアウト( リスト ) 一部抜粋									

    |[A]         |[B]    |[C]    |[D]    |[E]    |[F]    |[G]    |[H] |[I] 									
 [1]|イベント名  |コード1|コード2|コード3|コード4|コード5|コード6|担当|担当									
 [2]|データ送信  |A0100  |A0101  |A0102  |A0103  |A0104  |A0105  |鈴木|鈴木									
 [3]|再データ抽出|B0100  |B0101  |B0102  |B0103  |B0104  |B0105  |斉藤|林  									

 *担当者名が 2列あるのは、レイアウトにより切り替えて反映させる為です。									
 *詳しくは、「 苗字について 」で説明をさせていただきます。									

 ※ 実行マクロの概略説明									
'**************************************************************************************									
 *Sheet1 の「 C列 」セルに、複数の改行された業務内容( イベント名 )があります。									

 *Sheet2 に( イベント名 )内容に適応する、コードと、担当者名がリストとなっており、									
   リストを Sheet1 へ反映させ、さらに重要な( イベント )については									
   ( イベント名 )の「 フォントと、コード 」を赤色にします。									
   担当者名は、赤色では「不吉」という印象ですのでしません。									

 *イベント内容は下記の 8種類なのですが、「 通知作成 」と「 引落 」は									
   コードの必要がありません。									

 *また、 8種類の中に同系の( イベント )があります。									
   それが、「 データ抽出10日分 」と 「 データ抽出25日分 」となります。									

 ・データ送信									
 ・再データ抽出									
 ・データ後処理									
 ・会員用データ抽出									
 ・データ抽出10日分 ( 同系イベント )									
 ・データ抽出25日分 ( 同系イベント )									
 ・通知作成 ( コード必要なし )									
 ・引落     ( コード必要なし )									

 *コードの先頭文字は、アルファベットで「 AからE 」の5種類です。									
   全てのコードが、「 A0100 」等の半角5文字で構成がされています。									

 *コードと担当者名を反映させるのは、5つの( イベント )になり									
  その中の重要なイベントのみ、フォントを赤色にします。									

 *重要なイベントとは? どれかと言うと、下記になります。									
 「 会員用データ抽出 」と「 コード 」のフォントを赤色にします。									

 *ここ迄でレイアウトと、マクロの概要が理解できますでしょうか?									
   イメージはなんとなく解るかなと思いますが、詳細のレイアウトが無いと									
   無論ですが理解できないと思いまして、マクロで準備がしてあります。									

 *実際のマクロを動かして頂いた方が早いので、レイアウトの作成から実行									
   迄の手順、及び( 問題の箇所 )を説明させていただきます。									

 ※プロシージャについて									
'**************************************************************************************									
 ★レイアウト作成用									
 ・Sub Input_rule() '' 入力規則設定									
 ・Sub VerticalCalendar_Make() '' 縦型カレンダー作成									
 ・Function production_Easydata(ByRef v As Long, ByRef data As String)									
 ・Function production_Harddata(ByRef v As Long, ByRef data As String)									
 ・Sub Sheet2_Make() '' Sheet2 のレイアウト作成用									

 ★実行用									
 ・Sub GetEvent_Code() '' main 実行用									
 ・Function production_data(ByRef vdata As Variant)									

 ★追求用									
 ・Sub 試験用() '' 上手く行かない箇所の追求用									

 *八つのプロシージャがありまして、二つの試験用レイアウトがあります。									
 *私の個人的見解( マクロの難易度 )で [ 初級:Easy版 , 上級:Hard版 ] の									
   二つのレイアウトがありますが、入力規則で切り替えて使用します。									
   因みに、[ 中級:Normal版 ]はありません。									

 *二つのレイアウトの違いは、担当者名の「 苗字 」の文字数による違いがあります。									
   ・[ 初級:Easy版 ]では、担当者全員が 2文字の苗字です。									
   ・[ 上級:Hard版 ]では、担当者全員の文字数がバラバラとなり									
    1文字〜最大5文字の苗字となります。									

 ※ 問題の箇所について									
'**************************************************************************************									
 ・[ 初級:Easy版 ] レイアウトで、Sub GetEvent_Code() '' main 実行用									
   を実行すると13行目が、下記のようになります。									

     |[A]|[B]|[C]             |[D]  |[E] 									
 [13]| 10|月 |会員用データ抽出|D0101|菅沼 ← ココが問題の箇所です。									
             |データ後処理    |C0102|山田									
             |再データ抽出    |B0102|斉藤									
             |データ送信      |A0105|鈴木									

 《 問題の箇所について 》									

 *C13セル 「 会員用データ抽出 」、D13「 D0101 」 のフォントが									
   赤色に「 1回目 」の実行では成功します。									

   しかしながら、もう一度実行をすると									
   D13セルの全ての「コード」が赤色になってしまいます。									
   その原因が解らず、途方に暮れています。( ; ; )									

 *ローカルウィンドウと、睨めっこ( にらめっこ )し原因を									
   探すも解らず 「 Sub 試験用() '' 上手く行かない箇所の追求用 」									
   にて debug.print するも解らず、お手上げ寸前です。									

 ※レイアウトの準備 〜 実行についての手順です。									
'**************************************************************************************									
 1.Sub Input_rule() '' 入力規則設定を実行すると、E1セルに									
   入力規則ができます。									

 2.入力規則の中から、EASYを選択します。									
 3.Sub VerticalCalendar_Make() '' 縦型カレンダー作成									
   を実行すると、EASY版レイアウトが完成します。									

 4.Sub Sheet2_Make() '' Sheet2 のレイアウト作成用を実行します。									
 Sheet2 にリストができます。									

 *上記迄で、レイアウトの準備は終わりです。									
 *main ( Sheet1 ) へボタンを設置する場合は、上2行のF列から右に									
   配置するのがベストとなります。									

 5.Sub GetEvent_Code() '' main 実行用 をすると、完成します。									
   もう一度、連続で EASY版を実行すると失敗します。( ; ; )									

 ※レイアウトの切替について									
'**************************************************************************************									
 *D1セル : EASY版 と、E1セル : EASY に入力規則が設定された									
 時に、実行プロシージャがエラー無く走ります。									

 *D1セル : EASY版 と、E1セル : HARD に入力規則が設定された									
 場合は、エラーになります。									

 HARD を実行する場合は、D1セルを HARD版に切り替えをしないと									
 実行プロシージャが正しく走らない為、雛形カレンダーを設定する									
 プロシージャから変更しなければ、いけない使用となります。									

 ※ 担当者の「 苗字について 」									
'**************************************************************************************									

 *Yahoo Japan 知恵袋によると、現在の日本人の苗字で									
 長い方で、最大6文字の方がいるかも?のようですが。。。									
 5文字の方さえも、お会いしたことが無いので設定は									
 最大5文字としました。									

 '*******************************************************************************									
 : [ 苗字 ]左衛門三郎さんについて									
 : 参考URL : 株式会社 小学館									
https://hugkum.sho.jp/347846									

 : 6文字の苗字は存在するのでしょうか?  : Yahoo Japan 知恵袋									
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1411699934									
 '*******************************************************************************									
 長い説明ですいません。(o_ _)o. ペコ									
 原因の追究を、お手伝いいただければ嬉しいです。									

 ★コードはここからです。									

 Option Explicit									
 Sub GetEvent_Code() '' main 実行用									

    Dim vSerch As Range									
    Dim dicObje As Object									
    Dim Evnt, cnt, data, Evnt_Code(), Rep(), One_Character, manager(5)									
    Dim str As String, pattern As String, keyword As String									
    Dim i&, v&, q&, k&, n&, j&, vp&, sp&									
    Dim num As Long, match As Long, LastRow As Long, LastCol As Long									
    Set dicObje = CreateObject("Scripting.Dictionary")									
    pattern = "*データ*"									
    keyword = "*会員用*"									

    With Sheets(2)									
        LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column									
        Set vSerch = .Range(.Cells(2, 1), .Cells(7, LastCol))									
    End With									

    With Sheets(1)									
        If .Cells(1, 4) Like "*E*" Then									
            If Not (.Cells(1, 4) Like "*E*" And _									
            .Cells(1, 5) Like "*E*") Then GoTo Err									
        Else									
            If Not (.Cells(1, 4) Like "*H*" And _									
            .Cells(1, 5) Like "*H*") Then GoTo Err									
        End If									

        LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row									
        .Range(.Cells(4, 4), .Cells(LastRow, 5)).ClearContents									
        sp = IIf(Cells(1, 4) Like "*E*", 2, 5)									
        vp = IIf(Cells(1, 4) Like "*H*", 1, 0)									

        Application.ScreenUpdating = False									
        For q = 4 To LastRow									
            data = Split(.Cells(q, 3), vbLf)									
            ReDim Evnt_Code(Len(.Cells(q, 3)) - _									
                        Len(Replace(.Cells(q, 3), vbLf, "")))									
            ReDim Rep(Len(.Cells(q, 3)) - _									
                        Len(Replace(.Cells(q, 3), vbLf, "")))									

            For i = 0 To UBound(data)									
                If Not data(i) Like pattern Then									
                        Evnt_Code(i) = Space(5)									
                        Rep(i) = Space(sp)									
                Else									
                    If Not dicObje.Exists(data(i)) Then									
                        dicObje.Add Key:=data(i), Item:=1									
                        Evnt_Code(i) = Application.VLookup(data(i), vSerch, 2, False)									
                        Rep(i) = Application.VLookup(data(i), vSerch, 8 + vp, False)									
                        manager(n) = Rep(i)									
                        n = n + 1									
                    Else									
                        dicObje(data(i)) = dicObje(data(i)) + 1									
                        Evnt_Code(i) = Application.VLookup(data(i), vSerch, dicObje(data(i)) + 1, False)									
                        Rep(i) = Application.VLookup(data(i), vSerch, 8 + vp, False)									
                    End If									
                End If									
                        If Not .Cells(1, 5) Like "*E*" Then _									
                        production_data Rep(i)									
            Next i									

            .Cells(q, 4) = Join(Evnt_Code, "")									
            .Cells(q, 5) = Join(Rep, "")									

            num = 5									
            If Right(.Cells(q, 4), 1) <> Chr(10) Then									
                For k = 1 To Len(.Cells(q, 4)) Step num									
                    str = str & Mid(.Cells(q, 4), k, num) & Chr(10)									
                Next									
                    .Cells(q, 4) = str: str = ""									
                Do While Right(.Cells(q, 4), 1) = vbLf									
                    .Cells(q, 4) = Left(.Cells(q, 4), Len(.Cells(q, 4)) - 1)									
                    .Cells(q, 4).VerticalAlignment = xlTop									
                Loop									
            End If									

            If Right(.Cells(q, 5), 1) <> Chr(10) Then									
                If .Cells(1, 5) Like "*E*" Then num = 2									
                For k = 1 To Len(.Cells(q, 5)) Step num									
                    str = str & Mid(.Cells(q, 5), k, num) & Chr(10)									
                Next									
                    .Cells(q, 5) = str: str = ""									
                Do While Right(.Cells(q, 5), 1) = vbLf									
                    .Cells(q, 5) = Left(.Cells(q, 5), Len(.Cells(q, 5)) - 1)									
                    .Cells(q, 5).VerticalAlignment = xlTop									
                Loop									
            End If									

            If .Cells(q, 3) Like keyword Then									
                For j = 1 To Len(.Cells(q, 3))									
                    One_Character = Mid(.Cells(q, 3), j, 1)									
                    If One_Character = "会" Then									
                        match = j									
                        .Cells(q, 3).Characters(match, 8).Font.Color = vbRed									
                    End If									
                Next									

                For j = 1 To Len(.Cells(q, 4))									
                    One_Character = Mid(.Cells(q, 4), j, 1)									
                    If One_Character = "D" Then									
                        match = j									
                        .Cells(q, 4).Characters(match, 5).Font.Color = vbRed									
                    End If									
                Next									
            End If									
                Erase Evnt_Code									
        Next q									
                .Columns(4).HorizontalAlignment = xlCenter									
                .Columns(5).EntireColumn.AutoFit									
                .Columns(5).HorizontalAlignment = xlCenter									
                Application.ScreenUpdating = True									
    End With									

    Evnt = dicObje.Keys									
    cnt = dicObje.items									

    For v = 0 To UBound(Evnt)									
        If Evnt(v) <> "" Then									
             With Sheets(2)									
                .Cells(v + 10, 1) = Evnt(v)									
                .Cells(v + 10, 2) = cnt(v) & "件"									
                .Cells(10, 3).Resize(UBound(manager) + 1) = _									
                          Application.Transpose(manager)									
             End With									
        End If									
    Next v									
        Set dicObje = Nothing									
    Exit Sub									
Err:									
    MsgBox "設定条件が揃っていない為、" & vbCrLf & _									
    "処理を実行できません", vbExclamation									
 End Sub									

 Function production_data(ByRef vdata As Variant)									
    Select Case LenB(vdata)									
        Case 2: vdata = vdata & Space(4)									
        Case 4: vdata = vdata & Space(3)									
        Case 6: vdata = vdata & Space(2)									
        Case 8: vdata = vdata & Space(1)									
        Case Else: vdata = vdata									
    End Select									
 End Function									

 Sub 試験用() '' 上手く行かない箇所の追求用									

    Dim i&, n&									
    Debug.Print "Len   文字数 : " & Len(ActiveCell.Value)									
    Debug.Print "LenB 文字数 : " & LenB(ActiveCell.Value)									
    Debug.Print "Conv 文字数 : " & LenB(StrConv(ActiveCell.Value, vbFromUnicode))									
    Debug.Print "セル内 vbLf 数 : " & Len(ActiveCell.Value) - _									
                         Len(Replace(ActiveCell.Value, vbLf, ""))									
                         n = Len(ActiveCell.Value) - _									
                         Len(Replace(ActiveCell.Value, vbLf, ""))									
    Debug.Print "実際の文字数 : " & Len(ActiveCell.Value) - n									

    For i = 1 To Len(ActiveCell.Value)									
        Debug.Print Mid(ActiveCell.Value, i, 1)									
    Next									
    If InStr(ActiveCell.Value, vbLf) > 0 Then									
        Debug.Print "vbLfあり"									
    End If									
    If InStr(ActiveCell.Value, vbCr) > 0 Then									
        Debug.Print "vbCrあり"									
    End If									
    If InStr(ActiveCell.Value, vbCrLf) > 0 Then									
        Debug.Print "vbCrLfあり"									
    End If									

    Rem : 問題箇所の情報です。									
    '************************************									
    '' EASY版 [ D13 ]セルの結果									
    '' Len   文字数 : 23									
    '' LenB 文字数 : 46									
    '' Conv 文字数 : 23									
    '' セル内 vbLf 数 : 3									
    '' 実際の文字数 : 20									
    '************************************									
 End Sub

 Sub VisualBasicEditor_ImidiateClear() '' Debug.Print一発削除									
    Application.VBE.Windows("イミディエイト").SetFocus									
    SendKeys " ^a", True									
    SendKeys "{DEL}", True									
 End Sub									

 Sub Input_rule() '' 入力規則設定									
    Sheets(1).UsedRange.Clear									
    With Sheets(1).[E1]									
        .Validation.Delete									
        .Validation.Add Type:=xlValidateList, Formula1:="設定,EASY,HARD"									
        .Font.Size = 9									
        .Font.Color = RGB(255, 20, 147)									
        .Interior.Color = RGB(255, 244, 243)									
        .Value = "設定"									
        .HorizontalAlignment = xlCenter									
    End With									
 End Sub									

 Sub VerticalCalendar_Make() '' 縦型カレンダー作成									

    Dim ws As Worksheet									
    Dim r As Range									
    Dim v, q, tmp, buf									
    Dim n&, x&									
    Dim Get_data As String									
    Dim keyword As String									
    Dim Layout_Settings As String									
    keyword = "*会員用データ抽出*"									
    Layout_Settings = "EASY"									
    Set ws = Sheets(1)									

    Application.ScreenUpdating = False									
    With ws									
        .[A3].CurrentRegion.Offset(1).Clear									
        .[A1] = 2023: .[B1] = 4: .[C1] = "月"									
        .[A3] = "日付": .[B3] = "曜日"									
        .[C3] = "イベント内容": .[D3] = "コード": .[E3] = "担当"									
        v = DateSerial(.[A1], .[B1], 1)									
        q = DateSerial(.[A1], .[B1] + 1, 0)									

        ReDim tmp(1 To 31, 1 To 2)									
        n = 0									

        For x = v To q									
            n = n + 1									
            tmp(n, 1) = x									
            tmp(n, 2) = x									

            If .[E1].Value = Layout_Settings Then									
                production_Easydata x, Get_data									
                .[C3].Offset(n) = Replace(Replace( _									
                Application.Trim(Get_data), " ", vbLf), " ", vbLf)									
                .[D1] = "EASY版"									
                .[D1].Font.Color = RGB(255, 20, 147)									
                .[D1].Interior.Color = RGB(255, 244, 243)									
                .[D1].Font.Size = 9									
                .[D1].HorizontalAlignment = xlCenter									
            Else									
                 production_Harddata x, Get_data									
                .[C3].Offset(n) = Replace(Replace( _									
                Application.Trim(Get_data), " ", vbLf), " ", vbLf)									
                .[D1] = "HARD版"									
                .[D1].Font.Color = RGB(255, 20, 147)									
                .[D1].Interior.Color = RGB(255, 244, 243)									
                .[D1].Font.Size = 9									
                .[D1].HorizontalAlignment = xlCenter									
            End If									
        Next									

                .[A4].Resize(31, 2) = tmp									
                .[A3].Resize(31).NumberFormatLocal = "d"									
                .[B3].Resize(31).NumberFormatLocal = "aaa"									

        For Each r In .[A4].Resize(31)									
            If Format(r, "aaa") = "日" Then									
                r.Resize(, 2).Font.Color = vbRed									
            ElseIf Format(r, "aaa") = "土" Then									
                r.Resize(, 2).Font.Color = vbBlue									
            End If									
        Next									

                .[A:E].EntireColumn.AutoFit									
                .[E3].ColumnWidth = 10									
                .[E3].HorizontalAlignment = xlCenter									
                .[A3:D3].HorizontalAlignment = xlCenter									
                .[A3:B34].HorizontalAlignment = xlCenter									
                .[A3:E3].Interior.Color = RGB(240, 255, 255)									

                '' 罫線処理									
                .[A3].Resize(32, 5).Borders.LineStyle = xlDot        '' 全体									
                .[A3:E34].BorderAround LineStyle:=xlContinuous '' 外枠									
                .[A3:E3].BorderAround LineStyle:=xlContinuous									
                .[B3:B34].Borders(xlEdgeLeft).LineStyle = xlHairline									
                .[B3:B34].Borders(xlEdgeLeft).Color = vbBlack									
                .[C3:C34].Borders(xlEdgeLeft).LineStyle = xlHairline									
                .[C3:C34].Borders(xlEdgeLeft).Color = vbBlack									
                .[D3:D34].Borders(xlEdgeLeft).LineStyle = xlHairline									
                .[D3:D34].Borders(xlEdgeLeft).Color = vbBlack									
                .[E3:E34].Borders(xlEdgeLeft).LineStyle = xlHairline									
                .[E3:E34].Borders(xlEdgeLeft).Color = vbBlack									
                ActiveWindow.DisplayGridlines = False '目盛線を非表示									

        n = 0									
        For Each r In .[C4:C34]									
            buf = r.Value									
            n = n + 1									
            Do While Right(buf, 1) = vbLf									
                buf = Left(buf, Len(r.Value) - 1)									
                r.VerticalAlignment = xlTop									
            Loop									
            .[C3].Offset(n) = buf									
        Next									

    End With									
    Application.ScreenUpdating = True									
    Erase tmp									

 End Sub									

 Function production_Easydata(ByRef v As Long, ByRef data As String)									
    Select Case CDate(v)									
        Case "2023/4/1": data = "データ抽出10日分 データ送信 通知作成"									
        Case "2023/4/2": data = "データ送信 再データ抽出"									
        Case "2023/4/3": data = "引落"									
        Case "2023/4/4": data = "データ送信 データ後処理"									
        Case "2023/4/5": data = "再データ抽出 通知作成"									
        Case "2023/4/6": data = "データ後処理"									
        Case "2023/4/7": data = "会員用データ抽出"									
        Case "2023/4/8": data = "データ抽出25日分 データ送信"									
        Case "2023/4/9": data = "データ送信"									
        Case "2023/4/10": data = "会員用データ抽出 データ後処理 再データ抽出 データ送信"									
        Case Else: data = ""									
    End Select									
 End Function									

 Function production_Harddata(ByRef v As Long, ByRef data As String)									
    Select Case CDate(v)									
        Case "2023/4/1": data = "データ抽出10日分 データ送信 通知作成"									
        Case "2023/4/2": data = "再データ抽出"									
        Case "2023/4/3": data = "データ後処理 通知作成 会員用データ抽出"									
        Case "2023/4/4": data = "データ後処理"									
        Case "2023/4/5": data = "引落 通知作成 再データ抽出"									
        Case "2023/4/6": data = "データ後処理"									
        Case "2023/4/7": data = "引落  会員用データ抽出 通知作成"									
        Case "2023/4/8": data = "データ抽出25日分 データ送信"									
        Case "2023/4/9": data = "データ送信"									
        Case "2023/4/10": data = "通知作成 データ後処理 会員用データ抽出 再データ抽出 "									
        Case Else: data = ""									
    End Select									
 End Function									

 Sub Sheet2_Make() '' Sheet2 のレイアウト作成用									

    Dim ws As Worksheet									

    If Sheets.Count = 1 Then Sheets.Add after:=Sheets(Sheets.Count)									
    Application.GoTo Worksheets(2).Cells(1, 1), True									
    Set ws = Sheets(2)									

    Application.ScreenUpdating = False									
    With ws									
        .[A1] = "イベント名"									
        .[A2] = "データ送信"									
        .[A3] = "再データ抽出"									
        .[A4] = "データ後処理"									
        .[A5] = "会員用データ抽出"									
        .[A6] = "データ抽出10日分"									
        .[A7] = "データ抽出25日分"									

        .[B1] = "コード1"									
        .[B2] = "A0100"									
        .[B3] = "B0100"									
        .[B4] = "C0100"									
        .[B5] = "D0100"									
        .[B6] = "E0100"									
        .[B7] = "E0101"									

        .[H1:I1] = "担当"									
        .[H2] = "鈴木": .[I2] = "鈴木"									
        .[H3] = "斉藤": .[I3] = "林"									
        .[H4] = "山田": .[I4] = "勅使河原"									
        .[H5] = "菅沼": .[I5] = "佐々木"									
        .[H6] = "三浦": .[I6] = "左衛門三郎"									
        .[H7] = "三浦": .[I7] = "左衛門三郎"									

        .[B1:B5].AutoFill Destination:=[B1:G5]									
        .[A1:I1].Interior.Color = RGB(240, 255, 255)									
        .[A:G].EntireColumn.AutoFit									
        .[H:I].ColumnWidth = 10									
        .[H1:I1].HorizontalAlignment = xlCenter									
        .[A1].CurrentRegion.Borders.LineStyle = xlHairline									
    End With									
    Application.ScreenUpdating = True									

 End Sub									

 ※ その他									
'**************************************************************									
 *マクロのダメ出し									
 *こんなマクロじゃ、最初から書き直した方が早い...とあらば									
 全訂正版のお手本を頂けると、もっと喜びます。(人´∀`)♪															

< 使用 Excel:Excel2021、使用 OS:Windows11 >


>もう一度実行をするとD13セルの全ての「コード」が赤色になってしまいます。

セルのフォントの色が変わってしまったからでしょう。

(しんぷる) 2023/05/02(火) 16:08:32


 これでわかるんじゃないかしら    
    Sub test()
        With [a1]
            .Value = "いろはに" & vbCrLf & "ほへと"
            .Characters(1, 4).Font.Color = vbRed
            MsgBox "いろはに だけ赤くなる"
            .ClearContents
            .Value = "ちりぬるを" & vbCrLf & "わかよたれそ"
            MsgBox "一度消しても、キャラクターの色情報は残っている"
            .Clear
            .Value = "ういのおくやま" & vbCrLf & "けふこえて"
            MsgBox "Clearなら全部消える"
        End With
    End Sub

(稲葉) 2023/05/02(火) 16:30:12


 (しんぷる)さん、(稲葉)さん						
 返信をありがとうございます。						

 (稲葉)さん、 testマクロをありがとうございます。						
 そうなんです。質問する前に、Clear だと、罫線が消えるので						

 ↓下記を一行追加したらならなかったので、						
 .Range(Cells(4, 3), Cells(34, 4)).Font.Color = vbBlack						

 何なんだろうと調べていたのですが

 ※ HARD版では、上記の一行を追記無しで...2回連続で実行しても						
    上手く行ってるんです…これはどうして上手く行くのでしょうか?						

 ※ Characters くんを使う事が無かったので、今から調べてみます。						
(あみな) 2023/05/02(火) 18:06:13

 こっちの環境だとどっちでも全部赤くなるけど・・・
(稲葉) 2023/05/02(火) 19:13:18

  (; ∀ ) マヂデスカ...嘘言うわけ無いですわねェ

 私の、Excel ( 2021 )くん…HARD版で連続10回しても正常なのです。
 対象の、1改行分以外は赤くならないんです。
 だから、頭可笑しくなって来てて...

 でも、お付き合いいただきありがとうございます。
 どうしようも無い事が判明しました。
 実家に帰った時に、Excel ( 2010 )くんで試してみます。

 ※お手間ですが...他の方で、もし情報を頂けたら
 宜しくお願いします。
(あみな) 2023/05/02(火) 19:56:12

 読み解くの大変だったけど、もう少し注釈入れたり、処理まとめると読みやすくなるかも・・・?

    Sub GetEvent_Code() '' main 実行用
        Dim vSerch As Range
        Dim vp As Long, sp As Long
        Dim LastRow As Long
        Dim ev_cnt As Object: Set ev_cnt = CreateObject("Scripting.Dictionary")
        Dim ev一覧 As Variant
        Dim wsf As WorksheetFunction: Set wsf = Application.WorksheetFunction
        Dim chrNum As Long
        Dim rw As Long
        Dim s As Variant, strEv As String, strRep As String

        Const keyword As String = "会員用データ抽出"
        With Sheets(2)
            Set vSerch = .Range(.[a2], .Cells(7, .Cells(1, .Columns.Count).End(xlToLeft).Column))
        End With
        With Sheets(1)
            Select Case Left(.[D1].Value, 1) & Left(.[E1].Value, 1)
                Case "EE"
                    sp = 2
                    vp = 0
                Case "HH"
                    sp = 5
                    vp = 1
                Case Else
                    MsgBox "条件があっていないため、中断します"
                    Exit Sub
            End Select
            LastRow = .Cells(.Rows.Count, 3).End(xlUp).Row
            .Range(.Cells(4, 4), .Cells(LastRow, 5)).ClearContents

            For rw = 4 To LastRow
                'イベントコード/担当者補完
                strEv = ""
                strRep = ""
                For Each s In Split(.Cells(rw, "C").Value, vbLf)
                    If ev_cnt.exists(s) Then
                        ev_cnt(s) = ev_cnt(s) + 1
                    Else
                        ev_cnt(s) = 2
                    End If
                    strEv = strEv & vbLf & Application.IfError(Application.VLookup(s, vSerch, ev_cnt(s), 0), Space(5))
                    strRep = strRep & vbLf & Application.IfError(Application.VLookup(s, vSerch, 8 + vp, 0), Space(5))
                Next s
                .Cells(rw, "D") = Mid(strEv, 2)
                .Cells(rw, "E") = Mid(strRep, 2)

                '会員用データ抽出の文字に色つけ
                With .Cells(rw, "C")
                    .Characters.Font.Color = 0
                    chrNum = InStr(.Value, keyword)
                    If chrNum > 0 Then
                        .Characters(chrNum, Len(keyword)).Font.Color = vbRed
                    End If
                End With

                'コードがDから始まるデータに色つけ
                With .Cells(rw, "D")
                    .Characters.Font.Color = 0
                    chrNum = InStr(.Value, "D")
                    If chrNum > 0 Then
                        .Characters(chrNum, 5).Font.Color = vbRed
                    End If
                End With
            Next rw
            .Columns(4).HorizontalAlignment = xlCenter
            .Columns(5).EntireColumn.AutoFit
            .Columns(5).HorizontalAlignment = xlCenter
        End With

        '件数出力
        With Sheets(2)
            ev一覧 = .Range(.[a2], .[a2].End(xlDown)).Resize(, 3).Value
            For v = 1 To UBound(ev一覧, 1)
                ev一覧(v, 2) = wsf.CountIf(Range("Sheet1!C:C"), "*" & ev一覧(v, 1) & "*") & "件"
                ev一覧(v, 3) = Application.VLookup(ev一覧(v, 1), vSerch, 8 + vp, 0)
            Next v
            .[a1].End(xlDown).Offset(2).Resize(UBound(ev一覧, 1), UBound(ev一覧, 2)).Value = ev一覧
        End With
        MsgBox "完了しました"
    End Sub

 >            num = 5									
 >           If Right(.Cells(q, 4), 1) <> Chr(10) Then	
 ここから下の部分、まじで何がしたいかわからなかったから、省いちゃった

(稲葉) 2023/05/02(火) 20:29:24


ばんわ〜。。。^^
おひさしぶりです。。。(#^^#)///
じじいの安易な考え[浅知恵^^;]解決方法
 Sub mp()
    VerticalCalendar_Make
    GetEvent_Code
 End Sub
とかじゃダメなのですよね。。。毎回作り直しじゃ
むだっすよね。。。m(_ _)m
こちらでは
あみな先生のご説明通りの動作みたいですよ。
実験代行だけでも。。。( ̄▽ ̄;)もう少し私も勉強してみます。
でわ
m(__)m
(隠居Z) 2023/05/02(火) 20:33:55

 キタ━━━━。゚+.ヽ(´∀`*)ノ ゚キタ(・∀・)コレ+.゚稲葉さん、ありがとうございます。							
 正常に、動いておりま〜す。							

 *明日から分解処理して勉強します。							

 >ここから下の部分、まじで何がしたいかわからなかったから、省いちゃった							

 そこは、(   ノ)ノーえットーー Joinくんで纏めて突っ込んで〜							
 ↓こんなかんじです。							

 ・改行文字数を指定して							
 ・範囲のデータを取得して							
 ・セル内に改行が含まれるかチェックして							
 ・指定文字数ごとに改行処理して							
 ・無駄な改行コードを削除して							
 ・配置を上詰めして							

 ってイメージダスキンです。Σヾ(・ω・´;)ノ━	
 本当にありがとうございます。

 ※ IIFくんとられちゃったでorz					
(あみな) 2023/05/02(火) 21:36:11

  (*´∀`*)ノコンバン?h---(隠居Z)さまっ〜〜〜〜〜〜〜〜〜									

 しょっちゅう見てる気がしてますが..(ゝω・)vキャピ					
 解決方法案をありがとうございます。					
 ちょっと、今からしてみます。					

 >あみな先生のご説明通りの動作みたいですよ					
 うちが先生では、「 Excel VBA 」する人は、皆先生だォ					

 因みに、(隠居Z)さまはバージョンなんでしたっけ?					
 2019 でしたっけ?
(あみな) 2023/05/02(火) 21:38:49

あ、すみません〜 ^^
win10 home
excel 2016 ← 365タイプです【Office Personal premium】
マイクロソフト様のご説明では
PC に付属でプレインストールされている製品で、その PC 1台のみで使用できる永続ライセンス
の製品です。常に新しい機能、最新のバージョンにアップグレードされるので、バージョンの表
示がありません。(現状は2016となっています)

A.1年間無償の Office 365 サービスが付いています。2年目以降サービスを継続する場合は有償に
 なります。
 Office 365 サービスは、OneDrive の1TBの利用、skypeの利用、テクニカルサポートなどです。
A.はは既に切れています ^^;
で〜す。
(*^^*)///。。。m(_ _)m

(隠居Z) 2023/05/02(火) 22:10:47


 (*Ü*)ノ☆*。(隠居Z)さま〜〜〜〜〜。

 ↓これでもちゃんと動くでありますね。無駄あるけどw

 Sub mp()
    VerticalCalendar_Make
    GetEvent_Code
 End Sub

 詳しいバージョンをありがとうございます。
 そんなに詳しく…(笑)

 ぉ ゃd(*ゝωб*)bすみ*─(б´∀`)グッナイちゃんです。+゚o。。
(あみな) 2023/05/02(火) 22:47:22

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.