マクロが全然できない為、教えていただけないでしょうか。
①下記のように1列各行に記入されたデータを各項目別でセル分割(抽出)したいです。
(分かりずらくて申し訳ありません。)
O1000(MAIN)
N0006(2018/06/07)
N0010G00G17G40G49G64G80
N0011M00T07
N0015G90G20X100.0Y100.0Z100.0B100.0S1000F2000
N0020G04X0.5M11M111M112
N0030M50
↓
O1000(MAIN)←題名
N 他 G G G G G G M M M X Y Z B S F T
0006 (2018/06/07)
0010 00 17 40 49 64 80
0011 00 07
0015 90 20 100.0 100.0 100.0 100.0 1000 1000
0020 04 11 111 112 0.5
0030 50
②上記で分けたデータを別のデータと比較照合し、
異なる個所を”背景:黄色”,”文字色:赤色”で層別したいです。
主にシート1で基データ,シート2に比較データ
<やりたいこと>
シート2の比較データ側もしくは新規シート3に結果を表示するとして
ⅰ.基データと異なる値は文字を色塗り
ⅱ.基データにない行は背景を色塗り
ⅲ.基データにあり、比較データにない行は比較データ側に追記(背景と文字塗りの合わせ技)
かなりわがままなお願いかもしれませんが、お助けいただけると幸いです。
よろしくお願いいたします。
No.26ベストアンサー
- 回答日時:
No.25です。
取り敢えず私が最初の頃に回答してた『ただ単に分割するだけ』のコードを提示しますので、
分割が漏れなく希望通りになっているかを確認願います。
ただし『IF』の含まれている部分については除外してます。
Sub megu2()
Dim re As Object
Dim r As Range, st As String
Dim rr As Range, match
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "^([NO]\d+)(\(.*\))$|\(?[A-Z][\d\.]+\)?(\([A-Z\d\.]+?\))?"
re.Global = True
For Each r In Range("A1", Cells(Rows.Count, "A").End(xlUp))
If re.Test(r.Value) And InStr(r.Value, "IF[") = 0 Then
Set rr = r.Offset(, 2)
If re.Execute(r.Value)(0).Submatches(1) <> "" Then
rr.Resize(, 2).Value = Array(re.Execute(r.Value)(0).Submatches(0), re.Execute(r.Value)(0).Submatches(1))
Else
For Each match In re.Execute(r.Value)
rr.Value = match
Set rr = rr.Offset(, 1)
Next
End If
End If
Next
Set re = Nothing
End Sub
No.24
- 回答日時:
No.23です。
自動締め切りギリでしたね。
>では、なぜ分類できないのか?が疑問です。
WindFallerさんが作成していたコードはまずツール(英字+数字希に小数点)を頭文字(英字)毎に列分けをするのを優先してます。
その際にイレギュラー要因として
・1行目にある『題名』
・2行目以降にある『日付』
の判断にとどまってます。
なので『コメント行』については
・半角文字の存在を認めていない
・日付書式(yyyy/mm/dd)以外の"/"の使用は考慮していない
為と思います。
WindFallerさんからの返信が止まってしまっているようですが、上記部分を修正するかいっそIF文のように分割から除外(判定とは別問題です)を選ぶのか・・・・?
となりそうです。
VBSの正規表現はその他言語よりもちょっと癖があるようで、余り複雑なPatternにしてしまうと折角成功していた部分で別の問題発生もあり得そうですが。。。
『コメント分については"/"は有無の場合があるとして"半角の空白文字"は必ず存在するのでしょうか?
それとも存在せず区切りのない1文だけと言うケースもあり得ますか?
ギリでした、、すみません。
いつも丁寧に説明頂いてありがとうございます。分かりやすく助かります。
今のコードでは、コメントは日付のみを見ているんですね。
そして、
"半角の空白文字"は"必ず"ではないです。区切りのない1文だけもあり得ます。
No.23
- 回答日時:
No.22です。
>全角と半角で違うのでしょうか?
用いている『正規表現』においては元々が英語圏のものなので全角文字って扱いは本来無かった物です。(Microsoftもあっちですし)
それを日本ように『一応使えるべきだ』的な考えで追加されたような感じ(個人的には)ですので、扱いは変わってきます。
可能なら『全て半角』が良いのですが、そちらでのプログラム上に影響があってもダメですしね。
で、今回の作業が『あくまでもプログラムの確認であって分割した物を加工用プログラムとして使う訳ではなく、違いを把握したいだけ』であるなら、
本来とは違うので読みにくくなるかもですが事前に全て半角に変換した値で処理を行えれば回答者側は楽ですけれど。
そこで『全角になる箇所』とはどこになるのでしょうか?
今不具合のある
N0110(MENKAKOU B0.0)
N0120(TOOL / T01)
のような『コメント?』だけですか?
返信遅くなり、すみません。
もともと英語圏、、確かにそうですね、全角は日本独自のものという考えがしっくりきます。
プログラムを確認しましたが、全て半角でした。では、なぜ分類できないのか?が疑問です。
ちなみに()がついているのは、コメントのみとなります。
No.22
- 回答日時:
No.21です。
>N0110のような、()付のものが他の列に入らず、消去されてしまいました。
N0010(2018/06/07)
N0012(2018/06/10)
こちらは大丈夫なのでしょうか?
それとも全部という事?
>[ ]付も同様でした。
これは
>N0050IF[#850EQ1.0]GOTO110 ←IFもありますが無視でOK
なので分割せずでも構わないと受け取って良いのですかな?
早朝からご対応ありがとうございます。
N0010(2018/06/07)
N0012(2018/06/10)
は大丈夫でした。
全角と半角で違うのでしょうか?
検証したPRGデータを確認してみます。
そうだとすると、全角が混じってしまう事があり得るので、半角、全角に関係なく抽出する事は可能なのでしょうか?
IFのところは確かにそう言いましたね、失礼しました。分割せずで大丈夫です。
No.20
- 回答日時:
No.19です。
No.18のお礼にあるのは、No.8で使用されていた
Function ArrangeWords(ByVal sText As String, rng As Range)
~
End Function
と言うユーザー定義関数の部分だと思います。
ここを丸ごと追加で貼り付けて再検証されてみては?
No.19
- 回答日時:
No.17です。
WindFallerさん 少しでもお役に立てたのは嬉しいです。
区切り記号については私は浅い知識しかないので詳しくはないですが、以前VB.NETを始めた頃に回答する際正規表現でVBSの参照設定を使用していたら、
別回答者から”System.Text.RegularExpressions.Regex”を使う事を薦められ以降はもっぱらこちらで正規表現は勉強してました。
なんか昔からVBSの正規表現は使いにくいのか癖があるのか、後から出てきたテキストエディタとかの方が良かったりと感じます。
進歩はしてくれないんでしょうかね?
(どのみちうちのはお古ですけど)
と、分割についての検証の結果連絡もまだのようですが、分割に問題がないようであれば希望としては②は新たな質問を立ててもらって、
この質問リンクも貼って貰えたら回答件数が長引かずにとは思っているのですけど。
私の方は比較双方が同じ個数であればともかく、比較データに追加項目があった場合どうするか?で悩み中・・・と言うかやっぱ力尽きるかも?な予感も。
お礼が遅くなってしまい申し訳ありません。
出張の為、PC、スマホを手放していました。
頂いたPrgでの分割検証については、
No16のお礼で詳細書かせていただきましたが、
実行できず、エラー表示がでました。
対処方法がわからず、検証できていない状態です。
もしおわかりになれば、ご教授いただけると幸いです。
②については、
確かに質問を新たに立てたほうがいいかもしれませんね。
ありがとうございます。
長期的にご対応いただいて恐縮です。なにとぞよろしくお願いいたします。
No.18
- 回答日時:
こんにちは。
めぐみん_さん、すみません、ありがたく、利用させていただきます。
最近、すっかり根気がなくなってしまいました。これでも、正規表現はいまさら、再度勉強しているのですが……。
一応、また、再編成したベースになるものを作りましたので、ご利用ください。
でも、私の経験と勘では、区切り信号(delimiter)は存在するはずなのです。
'//標準モジュール データのある場所をアクティブシートとする
Sub SplitRegExp1()
''ver 1.02 '2018/06/13
Const MYLIST As String = "N,他,G,G,G,G,G,G,G,M,M,M,M,M,H,R,X,Y,Z,B,S,F,T"
Dim Re As Object
Dim Ms, m
Dim c As Variant
Dim a As String
Dim i As Long, k As Long, cnt As Long, n As Long
Dim p As Long
Dim Ar As Variant
Dim buf As Variant
Dim myLists As Variant
Dim sh2 As Worksheet
Set sh2 = Worksheets("Sheet2") '★出力シート
p = 1 'データ開始行
n = 1 '出力開始行
'MYLISTを直したときには、必ず、Function 内のSelect Case の数字も変えてください。
myLists = Split(MYLIST, ",")
If sh2.Cells(n, "A").CurrentRegion.Cells.Count > 2 Then
If MsgBox(sh2.Name & "は削除してよろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
End If
sh2.UsedRange.ClearContents
'題名とタイトル行
With sh2
buf = Split(Cells(p, 1).Value, "(")
sh2.Cells(n, 2).Value = "(" & buf(1)
.Cells(n, 1).Value = buf(0) '題名
.Cells(n + 1, "A").Resize(, UBound(myLists) + 1).Value = myLists
End With
n = 3
Set Re = CreateObject("VBScript.RegExp") '正規表現
With Re
.Global = True: .IgnoreCase = False: .MultiLine = False
End With
For Each c In Range(Cells(p + 1, 1), Cells(Rows.Count, 1).End(xlUp)) 'データ範囲
a = c.Value
If c.Value <> "" And c.Value Like "[A-Z][0-9]*" Then
If c.Value Like "*####/##/##*" Then '日付
buf = Split(c.Value, "(")
sh2.Cells(n, 2).Value = "(" & buf(1)
If UCase(Left(buf(0), 1)) = "N" Then
sh2.Cells(n, 1).Value = "'" & Mid(buf(0), 2) '日付
End If
Else
If InStr(1, c.Value, "(", 1) = 0 Then ''('のテキストコンペア
Re.Pattern = "[^\d](\-?\d[\d\.]+)" '●正規表現パターン
'一応残してあります。
Else
'めぐみん_さんのパターン
Re.Pattern = "(\()?[A-Z][\d\.]+(\))?(\([A-Z\d\.]+?\))?" '●正規表現パターン
End If
Set Ms = Re.Execute(StrConv(c.Value, vbNarrow)) '半角括弧にしました。
cnt = Ms.Count
If cnt > 0 Then
ReDim Ar(cnt - 1)
For Each m In Ms
Ar(i) = m.Value
i = i + 1
Next m
For k = 0 To UBound(Ar)
ArrangeWords Ar(k), sh2.Cells(n, 1)
Next k
i = 0
Erase Ar
Else
'' sh2.Cells(n, 1).Value = c.Value
End If
End If
n = n + 1
End If
Next c
''この項目は、文字を中央にするためのもので、不要だったら削除してください。
'sh2.Range("A1").Resize(n, UBound(myLists) + 1).HorizontalAlignment = xlCenter
MsgBox "終了", vbInformation
End Sub
お礼が遅くなってしまい申し訳ありません。出張しておりました。
頂いたPrgを投入して実行を押してみたのですが、
ArrangeWordsというところで引っかかって、進めませんでした。
”コンパイルエラー、SubもしくはFunctionが定義されていません”
となってしまいます。
マクロに疎く、解決策を検索しましたが、
わからずじまいでした。
もし、お分かりでしたら教えていただけないでしょうか。。。
No.17
- 回答日時:
No.16です。
No.16は基になったデータの方に全角括弧があった為のようです。
N0100G90G10L2P0X0.0Y0.0Z0.0B0.0(B0.0)(G53) N0100 G90 G10 L2 P0 X0.0 Y0.0 Z0.0 B0.0(B0.0) (G53)
N0170G01X100.0(X90.0)Y100.0(Y80.0)F200 N0170 G01 X100.0(X90.0) Y100.0(Y80.0) F200
尚Patternは
re.Pattern = "(\()?[A-Z][\d\.]+(\))?(\([A-Z\d\.]+?\))?"
に纏めてみました。
老眼がくやしぃ~。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/06 13:01
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/11 11:05
- Visual Basic(VBA) Excelのマクロについて教えてください。 1 2023/03/12 12:16
- Access(アクセス) エクセルのマクロについて教えてください。 2 2023/02/04 14:20
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/02/05 09:55
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- Excel(エクセル) Excel 文字列を結合するときに重複をなくしたい 関数・VBA 2 2022/12/12 10:40
- Excel(エクセル) Excelのウィンドウが少し小さく、ズレて立ち上がります 1 2022/06/27 16:25
- XML エクセルのマクロについて教えてください。 3 2023/02/06 09:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
文字の入力で横バー上段、中断...
-
全角括弧と全角読点の間隔を狭...
-
記号は半角と全角どちらがよい...
-
メッセージボックスで1025文字...
-
Excel関数「COUNTIF」で”文字”...
-
Replace関数は文字数の制限ある...
-
XMLのタグ名の禁則文字
-
半角記号、全角記号を含む正規...
-
=code(" ") で値が160となる文...
-
半角数字かどうかの判定
-
VBAで英数字入力チェックしたい。
-
エクセルでデータを30バイト...
-
入力データ「英数字」と「アン...
-
マクロできる方教えてください...
-
文字列中の両丸括弧を取り除くV...
-
エクセルのCOUNTIFが正しくカウ...
-
「半角スペース」と「 」...
-
ASP.net(C#) CheckBoxListで...
-
Phonetic関数を利用して文章中...
-
全角英数文字が嫌われる理由を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel関数「COUNTIF」で”文字”...
-
文字の入力で横バー上段、中断...
-
メッセージボックスで1025文字...
-
エクセルのCOUNTIFが正しくカウ...
-
半角記号、全角記号を含む正規...
-
全角括弧と全角読点の間隔を狭...
-
VBAで英数字入力チェックしたい。
-
全角英数文字が嫌われる理由を...
-
記号は半角と全角どちらがよい...
-
XMLのタグ名の禁則文字
-
Replace関数は文字数の制限ある...
-
文字列中の両丸括弧を取り除くV...
-
携帯電話の相手の電話番号にメ...
-
エクセルでの漢字、カタカナ、...
-
2つ以上の連続する空白文字を除去
-
Excel2002 一桁数字だけ全角に置換
-
VBScriptである文字列に半角文...
-
IT企業の技術屋にとって全角英...
-
特定の文字を簡単な操作で半角...
-
半角文字と全角文字の判別の仕方
おすすめ情報
<補足>
①について補足です。
データとは加工機械プログラムデータのことです。
O1000(以下Oナンバー)は題名、
N****(以下、Nコード)はプログラム内容のナンバリングしたものです。
また、始めに提示させていただいた例題に抜け漏れがありましたので、
更新させていただきました。(6/11・・PRG内容更新)
※更新例題は次の補足2に明記
<補足2>
※以下は例題として架空のプログラムを提示しております。
O1000(MAIN) ←題名
N0010(2018/06/07) ←最新の更新日を履歴として書くことが多い
N0020M00
N0030G91G28X0.0Y0.0
N0040 ←Nコード以降の内容がない行もあります
N0050IF[#850EQ1.0]GOTO110 ←IFもありますが無視でOK
N0060T01
N0070M06X0.0Y0.0
N0090M83
N0100G90G10L2P0X0.0Y0.0Z0.0B0.0(B0.0)(G53) ←()付きはコメントと履歴
N0110(MENKAKOU B0.0) ←()付きはコメント
N0120(TOOL / T01) ←()付きはコメント
N0130G00G17G40G49G64G80
N0140T02
以下、補足3へ続く
<補足3>
N0150G90G00G53X0.0Y0.0B0.0S2000M103M110
N0160G43Z0.0H99M03M10 ←Hが追記(質問時漏れ項目)
N0170G01X100.0(X90.0)Y100.0(Y80.0) F2000←()付きは履歴
N0180G01X170.0Y160.0R5.0 ←Rが追記(質問時漏れ項目)
N01900G01X0.0Y0.0
N0200G90G00G49G53Z-150.0
以上、これを基データとします。
___________________________________
②について、補足です。
まず、
①の分割後に②を行うかどうかは白紙にさせてください。
(①→②ではマクロ?関数?がややこしくなり兼ねる為)
以下、補足4につづく
<補足4>
次に、
比較データとは下記のことを示します。
(基データと基本ベースは同じ)
下記の←は起こりうる相違内容を説明しています。
相違どの行でも起こり得ます。
下記の()付き内はコメントとして利用されます。(履歴もコメントと同等のものです)
※あくまで、起こりうる相違内容なので事実とは異なります。
<以下、比較データ>
O1000(MAIN)
N0010(2018/06/07)
N0012(2018/06/10) ←N及び更新日追記
N0020M00
N0030G91G28X0.0Y0.0
N0040
N0050IF[#850EQ1.0]GOTO110
N0060T01
N0070M06X0.0Y0.0
N0090M83
以下、補足5へつづく
<補足5>
N0100G90G10L2P0X25.0(X0.0)Y0.0Z0.0B0.0(B0.0)(G53) ←()付きで更新されている
N0110(MENKAKOU B0.0)
N0120(TOOL / T01)
N0130G00G17G40G49G64G80
N0140T02
N0150G90G00G53X0.0Y0.0B0.0S2000M103M110
N0160G43Z0.0H99M03M10
N0170G01X100.0(X90.0)Y100.0(Y80.0)F2050←()無しで更新される(※たまにある)
N0180 ←Nコード以降が削除される
N0182G02X170.0Y160.0R5.0 ←Nコードが追加される
N01900G01X0.0Y0.0
N0200G90G00G49G53Z-150.0
以下、補足6へつづく
<補足6>
最後に、
②でやりたいことは
基データ(①で提示した例題)と比較データ(②で提示した例題)を照合した際に異なる情報を抽出(視覚化)したく、異なる内容を比較データ上に色分けで層別
層別内容は質問時に提案したⅰ)~ⅲ)ができればありがたいです。
<仕分け内容>
比較データ側もしくは新規シートに結果を表示するとして
ⅰ.基データと異なる値は文字を色塗り
ⅱ.基データにない行は背景を色塗り
ⅲ.基データにあり、比較データにない行は比較データ側に追記(背景と文字塗りの合わせ技)
以上
説明不足かつ、抜け漏れが多々ありご迷惑をおかけしました。
上記を再度折込、ご教授いただけると幸いです。
よろしくお願いいたします。