[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『セル内の、改行「 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 >
セルのフォントの色が変わってしまったからでしょう。
(しんぷる) 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
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.