• ベストアンサー

マクロの修正をお願いします

前回と前々回の質問で、マクロを作成していただき とても作業が楽になったのですが、一部変更してもらいたい点があり 再度質問させていただきます(何度も申し訳ありません) 自分でなんとかできないかと思ったのですが、どうにもできず・・すみません。 前回の質問へのリンク:http://okwave.jp/qa4383630.html D列から抽出した数値を、E~Qに書き出すように作成していただきました。 この書き出し先を「A列に数字が入っている行のE~Q」に変更していただきたいです。 (A1に数字が入っていたら、E1~Q1に書き出すようなかたち) A列には数行置きに数字が入っております。数字は全て半角英数です。 数字以外は、全て空欄のセルです(A1に数字、A2~A5まで空欄、A6に数字というような感じです) 本当に何度も申し訳ないのですが、急ぎませんので修正できる方がいらっしゃいましたらお願いします。 前回の質問で作成していただいたマクロはこちらです。 Sub test()  Dim RegExp As Object  Dim r As Range  Dim rr As Range, rs As Range  Dim i As Integer, j As Integer  Dim match, v  ReDim v(1 To 1, 1 To 6)    Set RegExp = CreateObject("VBScript.Regexp")  RegExp.Pattern = "\d+"  RegExp.Global = True  i = 7  For Each r In Range("D1", Cells(Rows.Count, 4).End(xlUp))      If InStr(r.Value, "(") And rr Is Nothing Then         Set rr = r.Resize(3)             For j = 1 To 3                 v(1, j) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(0)                 v(1, j + 3) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(1)             Next             rr.Item(1).Offset(, 1).Resize(, 6).Value = v             ReDim v(1 To 1, 1 To 6)             With rr.Resize(1).Offset(3)                  If RegExp.test(.Value) Then                     For Each match In RegExp.Execute(.Value)                         rr.Item(1).Offset(, i).Value = match.Value                         i = i + 1                     Next                  End If             End With      ElseIf LenB(r.Value) < 1 Then         Set rr = Nothing         i = 7      End If  Next  Set RegExp = Nothing  Set rr = Nothing  Erase v End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.17

ANo.15です。 補足事項のコードは、 Sub kesu() Range("A1", Cells(Rows.Count, 4).End(xlUp).Offset(, -3)).SpecialCells(xlCellTypeBlanks).EntireRow.Delete Range("D:D").Delete Shift:=xlToLeft End Sub これかな?

tricktrick
質問者

お礼

毎回迅速な対応ありがとうございます。 希望通りの動きでした。 前々回から長々とつきあわせてしまい、本当に申し訳ありませんでした。 あきれずに対処していただけて、本当に感謝しております。 ご協力いただけた皆様に良回答をつけたいのですが 良回答と次点の2名しか選べませんので、申し訳ありませんが今回のようにさせて頂きました。 皆様本当に本当に、どうもありがとうございました!!

その他の回答 (16)

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.16

これでどうでしょうか。 Sub test4()   Dim r As Range   Dim rr As Range   Dim ra As Range   Dim rd As Range   Dim i As Long   Dim j As Long   Dim k As Long   Dim v(1 To 13) As Variant      Set rr = Range("A1", Cells(Rows.Count, "A").End(xlUp))   Set rr = rr.SpecialCells(xlCellTypeConstants, 1)   For Each r In Range("D1", Cells(Rows.Count, "D").End(xlUp))     If InStr(r.Value, "(") <> 0 And InStr(r.Value, ")") <> 0 Then       i = i + 1       If i = 1 Then Set ra = rr.Areas(k + 1).Offset(, 4)       v(i) = Split(r.Value, "(")(0)       v(i + 3) = Split(Split(r.Value, "(")(1), ")")(0)     ElseIf InStr(r.Value, "すべて") <> 0 Then       i = 6       For j = 1 To 7         i = i + 1         v(i) = Replace(r.Value, "すべて", "")       Next j     ElseIf InStr(r.Value, "/") <> 0 Then       i = 6       For j = 1 To UBound(Split(r.Value, " "))         If IsNumeric(Split(r.Value, " ")(j)) Then           i = i + 1           v(i) = Split(r.Value, " ")(j)         End If       Next j     End If     If i = 13 Then       ra.Resize(, 13).Value = v       Set ra = Nothing       i = 0       k = k + 1     End If   Next   Set rr = Nothing End Sub

tricktrick
質問者

補足

何度もマクロを作成していただき、本当にどうもありがとうございました。 希望通りの動きとなり、大満足です。 質問を締め切る際、再度ポイント発行させていただきます。 この度は本当にどうもありがとうございました。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.15

ANo.13です。 未熟ながらに渋太く挑戦しました。 新たな補足があったようですので、変更しました。 Sub TRY_next()  Dim RegExp As Object  Dim r As Range  Dim rr As Range  Dim rm As Range  Dim i As Integer, j As Integer  Dim match, v  ReDim v(1 To 1, 1 To 7)    Set RegExp = CreateObject("VBScript.Regexp")  RegExp.Pattern = "\d+"  RegExp.Global = True  i = 7  For Each r In Range("D1", Cells(Rows.Count, 4).End(xlUp))      If Not IsEmpty(r.Offset(, -3)) Then Set rm = r      If InStr(r.Value, "(") And rr Is Nothing Then         Set rr = r.Resize(3)         If Not rm Is Nothing Then            For j = 1 To 3                v(1, j) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(0)                v(1, j + 3) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(1)            Next            With rr.Resize(1).Offset(3)                 If InStr(.Value, "すべて") Then                    ReDim Preserve v(1 To 1, 1 To 13)                    For j = 7 To 13                        v(1, j) = Replace(.Value, "すべて", "")                    Next                 ElseIf RegExp.test(.Value) Then                    For Each match In RegExp.Execute(.Value)                        v(1, i) = match.Value                        i = i + 1                        ReDim Preserve v(1 To 1, 1 To i)                    Next                 End If            End With            rm.Offset(, 1).Resize(, UBound(v, 2)).Value = v            Set rm = Nothing         End If      ElseIf LenB(r.Value) < 1 Or (r.Value = StrConv(r.Value, vbWide)) Then         Set rr = Nothing         i = 7         ReDim v(1 To 1, 1 To 7)      End If  Next  Set RegExp = Nothing  Set rr = Nothing  Set rm = Nothing  Erase v End Sub 結構ごちゃごちゃしてますが。 (正規表現使わなければもう少し行が減るかな?⇒単なる好みと思って下さい。)

tricktrick
質問者

お礼

すみません、説明不足な気がしたので再度お礼欄で失礼します… A列が空欄の行を全て削除=削除後は上にシフトする状態 D列を全て削除=削除後は左にシフトする状態(今までのE列がD列になる状態) こういう意味です。 D列の削除くらいは手動でやっても大した作業ではありませんので こちらはスルーしていただいてもかまいません。 お手数おかけしますが、よろしくお願いします。

tricktrick
質問者

補足

希望通りの動きとなり、大満足です。 前々回から、本当に本当にどうもありがとうございました。 あつかましいのですが、もう一つお願いしてもよろしいでしょうか… 新しくスレッドを作るべきかと思ったのですが 無関係という訳ではないのでこちらでお願いしたいと思います。 今回のマクロを実行したあと、必要なデータは全て A列に数字のある行に入った状態となります。 A列が空欄の行(数字が入っていない行)と、 データを抜き取ったD列を全て削除したいのですが そのマクロを作っていただけないでしょうか。 今回作っていただいたマクロを実行した後、 データがきちんと書き出されているかある程度目で確認したいので 今回のマクロに組み込んでいただくのではなく 別のマクロとして組んでいただければ助かります。 本当に何度もあつかましいのですが、よろしければお願いいたします。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.14

これでどうでしょうか。 Sub test3()   Dim r As Range   Dim rr As Range   Dim ra As Range   Dim rd As Range   Dim i As Long   Dim j As Long   Dim k As Long   Dim v(1 To 13) As Variant      Set rr = Range("A1", Cells(Rows.Count, "A").End(xlUp)).SpecialCells(xlCellTypeConstants, 1)   For Each r In Range("D1", Cells(Rows.Count, "D").End(xlUp))     If InStr(r.Value, "(") <> 0 And InStr(r.Value, ")") <> 0 Then       i = i + 1       If i = 1 Then Set ra = rr.Areas(k + 1).Offset(, 4)       v(i) = Split(r.Value, "(")(0)       v(i + 3) = Split(Split(r.Value, "(")(1), ")")(0)     ElseIf InStr(r.Value, "/") <> 0 Then       i = 6       For j = 1 To UBound(Split(r.Value, " "))         If IsNumeric(Split(r.Value, " ")(j)) Then           i = i + 1           v(i) = Split(r.Value, " ")(j)         End If       Next j       ra.Resize(, 13).Value = v       Set ra = Nothing       i = 0       k = k + 1     End If   Next   Set rr = Nothing End Sub >ANo.13の補足 >xls88さんが書いてくれたANo.7のマクロでは、エラーはでないのですが >C列のセルに半角英数(数字)という記載があった場合 >そのテーブルのみ展開されず、次のテーブルは展開されました C列は見ていないので無関係です。 D列のデータに明らかにされていない形のものがあるのではないでしょうか。

tricktrick
質問者

補足

再作成ありがとうございます。 C列はまったく関係ありませんでした。お騒がせいたしました。 データ内容をよく見てみたところ、 D列の曜日のセルに別の形式がありました。 月 半角数字 / 火 半角数字 / ・・・・という形式以外に 月~日までの数字が同じ場合だと、 すべて半角数字 という形式のものが 数セル入っておりました…今更こんなのを発見してしまい、申し訳ありませんorz これがあったため、K~Pまでが繰り上がって上に記載されたりして 書き出されていないように見えていたようです。 下記のような状態です 月 1 / 火 1 / 水 1 / 木 1 / 金 1 / 土 1 / 日 1  ↓ この場合下記のように記載されておりました すべて1 「すべて」と数字の間にはスペースはありません。数字は必ず半角数字です。 こういう形式で書かれているセルが少ししかなかったので見逃しておりました…申し訳ありません。 具体的には下記のようなデータとなります A1 数字 D6:D8 数字(数字) D9 月 1 / 火 1 / 水 1 / 木 1 / 金 1 / 土 1 / 日 1 A11 数字 D14:D16 数字(数字) D17 すべて1 A19 数字 D23:D25 数字(数字) D26 月 1 / 火 1 / 水 1 / 木 1 / 金 1 / 土 1 / 日 1 A28 数字 D31:D33 数字(数字) D34 すべて100 曜日の部分の記載が「すべて数字」という形式となっている箇所があった場合 数字の部分のみをK~Qにを書き出すように直していただく事は可能でしょうか… またはKにだけ数字を書き出してもらえれば、自分でQまでコピーますので それでもかまいません。お手数おかけいたしますが、よろしくお願いします。 なおn-junさんが書いてくださったANo.5のマクロだと、Kにだけ数字が入り、 繰り上がって書き出される事はありませんでした。 imogasiさんが書いてくださったANo.6のマクロではK以降に数字は入らず 繰り上がって書き出される事はありませんでした。 また後から追加の条件を出してしまい、本当に申し訳ありませんがよろしくお願いいたします( TДT)

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.13

ANo.10の補足について。 こちらでテストした範囲ではデータ【数値(数値)】の()が全角の場合にエラーになりましたが。 ただxls88さんのコードで同様のエラーが出ていないのが少し不思議な感じがしました。 たぶん未熟故の事でしょうから、私はお手上げですね。

tricktrick
質問者

お礼

申し訳ございません、上の補足の内容は間違いです・・・お礼の欄に失礼します。 色々試しているうちに、D1に数字(数字)というのが入っていたせいでエラーがでておりました。 C列はまったく関係なかったようです、本当に申し訳ありません。。。 なお、D1を消して再度試してみたところ、エラーは出ませんでしたが 下記のデータで試したところ A1 数字 D1:D5 空欄 D6:D10 4つの塊 A11 数字 D11:D13 空欄 D14:D17 4つの塊 結果はこうなりました ・D6:D10はE6:Q10に書き出されました(E1:Q1に書き出したい) ・D14:D17はE14:E17に書き出されました(E11:Q11に書き出したい)

tricktrick
質問者

補足

何度も申し訳ないです・・ データの状態で、書き漏れしているのはC列の内容になります。 C列にC列に半角英数(数字)という記載があったせいでした。 (必ず入っているという訳ではありませんが、今回試したデータのC2がそのセルでした) C列のセルの内容は、各テーブルの一番上の行(Aに数字が入ってる行)以外は 一切必要ないので、最初に「(」でC列を検索して、該当するセルを消去したところ ANo.7の補足に書いた結果とまったく同じく D列の4つの塊の先頭行のE~Qに書き出される形となりました。 xls88さんが書いてくれたANo.7のマクロでは、エラーはでないのですが C列のセルに半角英数(数字)という記載があった場合 そのテーブルのみ展開されず、次のテーブルは展開されました

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.12

>ANo.7の補足 前回の質問へのリンク:​http://okwave.jp/qa4383630.html >D1~D4と同じ書式のセルが何度もでてきます。 >その都度、横の欄に書き出せればと思っています。 >(D8~D11のように同じ書式が出てきた場合はE8~Q8に書き出す形) というようにしてあります。 その際、D列のデータを判定しています。 ですから >○D6:D10はE1:EQに書き出すことに成功しました >×D14:D17はE14:Q14に書き出されました(E11:Q11に書き出したい) >×D23:D26はE23:E26に書き出されました(E19:Q19に書き出したい) この結果はおかしいです。 D列のセルデータが期待したようになっていない可能性があります。 どちらにしても >D列から抽出した数値を、E~Qに書き出すように作成していただきました。 >この書き出し先を「A列に数字が入っている行のE~Q」に変更していただきたいです。 >(A1に数字が入っていたら、E1~Q1に書き出すようなかたち) >A列には数行置きに数字が入っております。数字は全て半角英数です。 >数字以外は、全て空欄のセルです(A1に数字、A2~A5まで空欄、A6に数字というような感じです) ということですから、新しい仕様に対応するようにコードを見直す必要があります。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.11

ANo.9です。 >試した時にA1に数字があり、D1~D5まで空欄がある状態でした。 この条件でテストした所エラーは出てませんので、詳細はデータがなければわかりません。 (提示ではなく、ファイルのことです。) 何か提示されていないデータの存在があるものと推測するくらいです。 あとは実際のファイルでデバッグしていくしかないですが、それは私には無理です。 書き出す位置については、#10の通りです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.10

ANo.8の2回目です。 ここを見落としてました。 >呼び出されているテーブルの始まりがA1(テーブルの一番左上のセル)なので >その横の欄のE~Qに、D列の4つの塊のセルの内容を書き出せる形になれば >作業が大変楽になるのですが… ここが理解できません。 結局E列以降に書き出す行は、何を基準に決まるのですか? 蛇足ですが。 >なんとかなるようでしたら再度作成をお願いいたします。 回答されたコードのテストをされていなくて、再度の作成依頼だと回答する側も落ち込みますよ。 補足の際には注意された方が宜しいかと。

tricktrick
質問者

補足

何度もお手数おかけして申し訳ないです。 テスト結果をちょうど補足で書いていたところでした。遅くなってすみません。 再度#5のマクロを実行した際のデータ状態を再度詳しく記載します。 A1 数字 D1:D5 空欄 D6:D10 4つの塊 A11 数字 D11:D13 空欄 D14:D17 4つの塊 この状態で実行したところ下記のようにエラーがでました 実行時エラー'9': インデックスが有効範囲にありません と出てます。デバックを選ぶと v(1, j) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(0) この部分が黄色になり、E~Qには全く書き出しできない状態です。 書き出し先ですが、 D6:D10を展開したものをE1:EQに D14:D17を展開したものをE14:Q14に書き出したいです。 書き出し先の基準はA欄に数字がある場合のE~Qです。 上の例でいくと、A1~A11の間は空欄のセルしかありません。 間が必ず10行と決まっている訳ではありませんので Aに数字が入っているセルの行のE~Qに…という意味です。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.9

ANo.8です。 言葉だけの説明よりもデータの状態を提示された方が、伝わるかと思います。 で、#5は#8の補足事項に対しては、一応考慮して作成しましたがそれでも無理だったでしょうか。 どのコードでどの部分がエラーになるとか、結果がこう違うとか、その辺りの補足も欲しいかと。

tricktrick
質問者

補足

レスありがとうございます。 #5のマクロを試したところエラーがでて書き出しできない状態です。 実行時エラー'9': インデックスが有効範囲にありません と出てます。デバックを選ぶと v(1, j) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(0) この部分が黄色になります。 試した時にA1に数字があり、D1~D5まで空欄がある状態でした。 試しにD1~D5を削除し、上にシフトしたところエラーはでなくなったのですが、 その次のE~Qの書き出し先が、Aに数字が入っている行でもなく D欄の塊の先頭の行でもなく、適当に?書き出されてしまいます。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.8

ANo.5です。 どうも初級レベルの私ですから、コードを複雑化してしまっているようで申し訳ないですし、 やっぱり解釈が違うような気がする。。。? >A列には数行置きに数字が入っております。数字は全て半角英数です。 >数字以外は、全て空欄のセルです(A1に数字、A2~A5まで空欄、A6に数字というような感じです) E列以降に書き出すのは、A列に値がある場合のみと解釈していたのですが違うようであればスル~して下さい。

tricktrick
質問者

補足

皆様、レス本当にありがとうございます。 マクロの作成もありがとうございます。 説明不足で申し訳ありません。最新の回答であるこちらのレスに説明させていただきます。 書き出しはすべて同一シート内(アクティブなシート)でという意味です。 D列にある4つの塊の最初(たとえばD8)と、A列の数値の入っているセルは同じ列にはありません。 A1に数字があり、D8に塊の先頭行があるような感じで、かなりずれています。 間が7行と決まっている訳ではなく A12に数字があり、D16に塊の先頭があったりと、間の行はランダムです。 前回の質問の際、D列の説明をD1からはじめていたので混乱させてしまいすみません。 元々HTMLのテーブルの部分をコピペしたもので そのHTMLはincludeで沢山のテーブルを呼び出したHTMLです。 呼び出されたテーブルは基本的に同じ形式なのですが (A1に数字B1、C1、D1に文字や数字等が入っており、D4あたりに4つの塊の先頭がある) そのテーブルの縦の長さは定まっておらず、C列に入るセル数によって縦の長さが変化します。 AB列はテーブルの一番上の段にしか記載されないので、C列が長くなればそれにあわせて空欄セルが増えていきます。 C列は、D列の行タイトル?のような役割のセルもあり C列にセルが増えると、D列には数字や文字が入ります。D列には、必ず4つの塊になる部分は出てきます。 C列には行タイトルの役割のないセルもあるので、その場合はD列に空欄が入ります。 呼び出されているテーブルの始まりがA1(テーブルの一番左上のセル)なので その横の欄のE~Qに、D列の4つの塊のセルの内容を書き出せる形になれば 作業が大変楽になるのですが… 上手く説明できずに申し訳ございません<(_ _)> ご面倒をおかけしますが、なんとかなるようでしたら再度作成をお願いいたします。

  • xls88
  • ベストアンサー率56% (669/1189)
回答No.7

これぐらいでどうでしょうか。 Sub test()   Dim r As Range   Dim ra As Range   Dim i As Long   Dim j As Long      For Each r In Range("D1", Cells(Rows.Count, "D").End(xlUp))     If InStr(r.Value, "(") <> 0 And InStr(r.Value, ")") <> 0 Then       i = i + 1       If i = 1 Then Set ra = r       ra.Offset(, i).Value = Split(r.Value, "(")(0)       ra.Offset(, i + 3).Value = Split(Split(r.Value, "(")(1), ")")(0)     ElseIf InStr(r.Value, "/") <> 0 Then       i = 6       For j = 1 To UBound(Split(r.Value, " "))         If IsNumeric(Split(r.Value, " ")(j)) Then           i = i + 1           ra.Offset(, i).Value = Split(r.Value, " ")(j)         End If       Next j       Set ra = Nothing       i = 0     End If   Next End Sub

tricktrick
質問者

補足

マクロ作成ありがとうございます。 データの内容の詳細について、ANo.8に補足してありますますので もしよろしければご覧くださいませ。 今回試した際のデータの状態は次のとおりです A1 数字 D6:D10 4つの塊 A11 数字 D14:D17 4つの塊 A19 数字 D23:D26 4つの塊 このデータの状態で試しました ○D6:D10はE1:EQに書き出すことに成功しました ×D14:D17はE14:Q14に書き出されました(E11:Q11に書き出したい) ×D23:D26はE23:E26に書き出されました(E19:Q19に書き出したい) このようになりました。 もし可能でしたら()内のように書き出せるように修正お願いいたします。

関連するQ&A

  • 変数で指定したセルの値を取得して計算させるには?

    sub 単月発生残高の取得() Windows("総勘定元帳データ").Activate Worksheets(1).Activate Range("a2").Activate Dim sRange As Range, eRange As Range, tRange As Range, uRange As Range Dim j As Long, k As Long Dim i As Integer For i = 3 To Range("a2").End(xlDown).Row Set sRange = Cells(i, 1) Set eRange = sRange.End(xlToRight) Set tRange = eRange.Offset(2, 0) Set uRange = tRange.Offset(0, -1) j= tRange.value k= uRange.value Range("B1").formula="=k-j" Range("A1").value="単月発生残高" Next Set sRange = Nothing Set eRange = Nothing Set tRange = Nothing Set uRange = Nothing End Sub 上記のマクロを組んでみましたが、j= tRange.value のところでエラーになります。 uRangeの値からtRangeの値を引いた値を"B1"に表示させたいのですが、うまくいきません。 どうすればいいでしょうか。

  • マクロでキーワードを抽出して別のシートに挿入する

    質問番号:4733370の質問と回答を勝手に引用させて頂きます。 セルA列にキーワードCCCが含まれていた場合に その行を削除してSheet2に貼り付けする・・・という下のマクロを 貼り付けの部分を挿入に変更したいのですが、なにぶんマクロ初心者 の為よくわからないので教えていただけないでしょうか・・ 宜しくお願い致します。 Sub キーワード切取貼付02() Dim r As Range, ur As Range, rr As Long Dim rd(), v Set r = Range("A1", Range("A65536").End(xlUp)).Find(What:="CCC", LookAt:=xlPart, After:=Range("A65536").End(xlUp)) If r Is Nothing Then 'なかったら MsgBox "ありません", vbCritical, "? ( ̄~ ̄;)う~ん  " Exit Sub '終了 Else 'あったら Do Until r Is Nothing '対象がなくなるまで ReDim Preserve rd(rr) '動的配列を用意 rd(rr) = r.Address(0, 0) '対象セルアドレスを配列に格納 rr = rr + 1 'カウント r.EntireRow.Cut Destination:=Sheets("Sheet2").Cells(rr, 1) '行の切り取り貼り付け Set r = Range("A1", Range("A65536").End(xlUp)).FindNext(r) '連続検索 Loop '繰り返し For Each v In rd() '各配列要素を If ur Is Nothing Then Set ur = Range(v) Else Set ur = Union(Range(v), ur) 'ユニオンに End If Next v ur.EntireRow.Delete 'ユニオンセルの属す行を一括削除 Set ur = Nothing Set r = Nothing End If MsgBox rr & "件をSheet2に移動しました。", vbInformation, " ( ̄ー ̄)v" End Sub

  • 作成方法についての質問です。

    下記のマクロで実行すると添付画像[現状]のようになってしまいます。 私としては[こうなってほしい]の形にしたいのですが、どこに何を組み込めばよいかわかりません。 誰か教えてください。 Dim Matches As Object Dim Match As Object Dim i As Long, j As Long Dim a As Variant With CreateObject("VBScript.RegExp") Set rng = Range("A1", Cells(Rows.Count, 1).End(xlUp)) Application.ScreenUpdating = False For i = 1 To rng.Rows.Count If InStr(1, rng.Cells(i, 1).Value, "(", 1) > 0 Then .Pattern = "\(([A-z\d,]+)" Else .Pattern = "([A-z\d,]+)" End If .Global = True Set Matches = .Execute(StrConv(rng.Cells(i, 1).Value, vbNarrow)) If Matches.Count > 0 Then a = Matches(0).SubMatches(0) a = Split(a, ",") Cells(i, 2).Resize(, UBound(a) + 1).Value = a End If j = 0 Next End With Application.ScreenUpdating = True Set rng = Nothing End Sub

  • エクセルの簡単なマクロ機能を追加したいのです

    既存のエクセルマクロ(Sub チェック()以下です)に下記の内容のマクロを付け足したいです。 教えていただけないでしょうか。 付け足したい条件です:  Sheet2のC列に 0  があれば  Sheet1のB列に 愛 と([太字]でセルの背景色を[灰色25%]にして)入れたいです 恐れ入りますがご存じの方がいらっしゃりましたら教えていただきたく何卒よろしくお願いいたします。 ----------------------------------------------- Sub チェック() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If c2.Offset(, 1).Value = "" Then c1.Offset(, 1).Interior.ColorIndex = 3 Else c1.Offset(, 1).Value = c2.Offset(, 1).Value End If myCt = myCt + 1 End If Next c2 If myCt > 1 Then c1.Offset(, 1).Interior.ColorIndex = 10 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • ExcelVBAマクロでのデータの受け渡し

    Sheet1「元データ」                  A   B    C   D     1  0001 みかん  A店  3/1  2 0200  りんご B店  3 0311 いちご B店  3/10 4    いちじく C店 5 0360 メロン  D店 6 かき   P店 7  0312 キウイ  D店 Sheet2「最新データ」   A   B    C   D 1  0001 みかん  A店  3/1 2 0190 3 0200  4 0311 いちご B店  3/10 5 0422  洋ナシ C店 6 0250 7 0500 すいか  P店  8  0312 キウイ       とあった時に最新データのA列の番号と元データの番号を見て同じ物があったら、最新データに元データの内容をうつし込むというデータがあります。 Dim Sh1 As Worksheet Dim Sh3 As Worksheet Dim myR As Range Dim N_D As Long Dim i As Long Set Sh1 = Worksheets("元データ") Set Sh3 = Worksheets("最新データ") With Sh3 For i = 5 To .Range("A65536").End(xlUp).Row N_D = .Range("E" & i).Value Set myR = Sh1.Range("A:A").Find(What:=N_D, LookIn:=xlValues, _ MatchCase:=False) If Not myR Is Nothing Then .Range("B" & i & ":D" & i).Value = _ myR.Offset(, 2).Resize(, 3).Value End If Next End With Set Sh1 = Nothing Set Sh3 = Nothing ここで、値は普通にコピーされてくるのですが、 フォントに色がついていたら、その色もつけたいのですが、どうすれば良いのか分らず困っています。 方法がありましたら、教えてください。 よろしくお願いします。

  • マクロ修正お願いします。

    以前質問してマクロを作成してもらった者です。 人事データ用に作っていただきました。 Sheet1   A   B   C 1 処遇 コード 名前.... 2 退社  3   あ   3 異動  4   か   4 入社  20   さ  Sheet2   A   B    C 1 コード 名前  データ1... 2  3   あ    3  4   か    4   Sub testsample() Dim Sh1 As Worksheet, Sh2 As Worksheet Dim r As Range, c As Range Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") For Each c In Sh1.Range("A2", Sh1.Range("A65536").End(xlUp)) Select Case c.Value Case "入社"  c.Offset(, 1).Resize(, 255).Copy Sh2.Range("A2").End(xlDown).Offset(1)  'B列より、右端255行を、シート2のA列の最後尾の次にコピーする。 Case "異動"  Set r = Sh2.Columns(1).Find(c.Offset(, 1).Value, , xlValues, xlWhole)  If Not r Is Nothing Then c.Offset(, 1).Resize(, 255).Copy r  'コードを検索して、その見つかったものを上書き Case "退社"  Set r = Sh2.Columns(1).Find(c.Offset(, 1).Value, , xlValues, xlWhole)  If Not r Is Nothing Then r.EntireRow.Delete  'コードを検索して、その見つかったものを削除 End Select Next End Sub このマクロで一箇所どーしたらいいか分からない場所があります。 「異動」があった場合、sheet1には氏名コードと新しく配属される部署やtelなどのみを書き、メールアドや氏名など異動しても変わらないものは書き込みません。変更があった箇所のみ上書きし空白部分はそのままにしたいです。何度もすみませんがお願いします。

  • カットして隣のB列に順番にペーストするマクロ

    発注と納品の確認マクロを作成しました。 Sheet1の列を検索して、Sheet2にあればその数字のあるセルを赤くするのですが、 それを以下のように変更することは可能でしょうか? Sheet1の列を検索して、Sheet2にあれば、Sheet2上でその数字をカットして隣のB列に上から順番にペーストします。 宜しくお願いします。 Sub 発注と納品の確認マクロ() Dim Ws1 As Worksheet Dim Ws2 As Worksheet Dim myRange1 As Range Dim myRange2 As Range Dim c1 As Range Dim c2 As Range Dim myCt As Long Set Ws1 = Worksheets("Sheet1") Set Ws2 = Worksheets("Sheet2") Set myRange1 = Ws1.Range("A1", Ws1.Cells(Rows.Count, "A").End(xlUp)) Set myRange2 = Ws2.Range("A1", Ws2.Cells(Rows.Count, "A").End(xlUp)) For Each c1 In myRange1 myCt = 0 For Each c2 In myRange2 If c2.Value = c1.Value Then If myCt = 0 Then c2.Interior.ColorIndex = 3 Else c2.Interior.ColorIndex = 43 End If myCt = myCt + 1 End If Next c2 If myCt = 0 Then c1.Interior.ColorIndex = 6 Next c1 Set Ws1 = Nothing Set Ws2 = Nothing Set myRange1 = Nothing Set myRange2 = Nothing End Sub

  • マクロdictionaryオブジェクト書き換え

    ここで教えていただいたマクロを   シート1のF列を検索値として   シート2のA列を検索しヒットしたら   シート2の該当行のD列をシート1のAE列に転記。   データの2列目から行う。ヒットしない場合は 無 と転記。 と変更したくて記述を書き換えたらシート1が壊れてしまいました。 正しい記述を教えてください。 ↓教えていただいた書き換え前の正常動作する記述↓ Sub 検索() 'dictionaryオブジェクトを使用 'シート1のA列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のE列をシート1のC列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定E列 With .Range("E2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (5)=E列 w = .Columns(5).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 A列 With .Range("A2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定 Offset(, 2)=検索値のA列より右2つ→C列 With .Offset(, 2) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub ---- ↓書き換えておかしな動きになった物 ●の部分を変更しました↓ Sub 検索02() 'dictionaryオブジェクトを使用 'シート1のF列を検索値として 'シート2のA列を検索しヒットしたら 'シート2の該当行のD列をシート1のAE列に転記 'データの2行目から行う。ヒットしない場合は無しと転記 Dim dic As Object Dim i As Long Dim v, w Dim t As Single t = Timer With Sheets("Sheet2") '返す値を指定D列● With .Range("D2", .Cells(.Rows.Count, 1).End(xlUp)) '検索する列指定 (1)=A列 v = .Columns(1).Value '返す値のある列指定 (4)=D列● w = .Columns(4).Value End With End With Set dic = CreateObject("scripting.dictionary") For i = 1 To UBound(v) dic(v(i, 1)) = i Next With Sheets("Sheet1") '検索値のある列指定 F列● With .Range("F2", .Cells(.Rows.Count, 1).End(xlUp)) v = .Value For i = 1 To UBound(v) If dic.exists(v(i, 1)) Then v(i, 1) = w(dic(v(i, 1)), 1) Else v(i, 1) = "無" End If Next '転記する列を指定  'Offset(, 25)=検索値のA列より右25個→AE列● With .Offset(, 25) .ClearContents .Value = v End With End With End With Set dic = Nothing Debug.Print Timer - t End Sub

  • エクセル マクロ 範囲指定。

    先日、OKWAVEのサイトでエクセルマクロの質問をさせていただき 下記の回答を活用したいのでしが myKey = Worksheets("Sheet2").Range("A1").ValueをA1A2・・・A50のように 50個を一度に処理したいのですがどのように変更すればよろしいのでしようか 自分なりに調べてみましたが知識がなくできませんでした ご回答のいただいたmitarashiさんにお聞きしたいのですがお聞きする手段がわからず 再度、質問させていただきます。                       宜しくお願いいたします。 Sub test() Dim targetRange As Range Dim buf As Variant Dim i As Long, j As Long, myColorIndex As Long Dim myKey As Variant Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Set targetRange = Worksheets("Sheet1").Range("J10:BB10000") buf = targetRange myColorIndex = 4 myKey = Worksheets("Sheet2").Range("A1").Value With targetRange For i = 1 To UBound(buf, 1) For j = 1 To UBound(buf, 2) If buf(i, j) = myKey Then .Cells(i, j).Interior.ColorIndex = myColorIndex Next j Next i End With Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic End Sub

  • エクセルのマクロについて

    エクセルのマクロについて エクセル2007を使用しています。もしよかったら教えて頂きたいと思っております。 現在利用しているメインシート(Sheet16で認識)のD5:I500の範囲内で1~31範囲の数字がランダムに入力されています。 この数字群の入ったセルをルール化しているセル背景色塗りを自動で処理したいためマクロを作成しております。 その仕様として、10個のシート(シート名:Aセット配色~Jセット配色)を作成して、各シートのB3:H7範囲に1~31までの数字が入っており、それぞれ数字に背景配色しています。Sheet16内と数字と条件によって該当する10個のシート内(シート名:Aセット配色~Jセット配色)の中から1つのシートとが一致したらそのセット配色シートのセルそのものの書式も運んでくれるルール設計になっています。 (※Sheet16の上記記載している範囲に直接入力及びコピーをして数字が一致したら、色が変わる仕組みになっています。) 更に、Sheet16内のJ3セルにA~J迄の半角英字を入力規制セットしており、例えばそのセルにCを入力すればCセット配色(シート名)、A入力であればAセット配色(シート名)を見に行き、該当処理をして行くという仕様になっております。 そのマクロ(※げNSheet16内に作成しています)が下記なのですが、拝見頂いて仕様がすぐお分かりになると思いますが、、 Private Sub Worksheet_Change(ByVal Target As Range) Dim v As Variant, c As Range, s As Range, myStr As String Dim rng As Range Set rng = Intersect(Target, Range("D5:I500")) If rng Is Nothing Then Exit Sub If Range("J3").Value = "" Then MsgBox "セット配色が未設定です。", vbCritical, "セットエラー " Exit Sub End If myStr = Range("J3").Value & "セット配色" Application.ScreenUpdating = False For Each c In rng.Cells For Each s In Worksheets(myStr).Range("B3:H7") v = c.Value If Not IsNumeric(v) Or v < 1 Or v > 31 Then Exit For c.Interior.ColorIndex = xlColorIndexNone c.Font.ColorIndex = xlColorIndexAutomatic If s.Value = v Then c.Interior.ColorIndex = s.Interior.ColorIndex c.Font.ColorIndex = s.Font.ColorIndex Exit For End If Next s Next c Application.ScreenUpdating = True Set rng = Nothing End Sub 今回の質問内容は、このマクロを少し仕様変更して、 C4:C500範囲でデータ書換えがあった場合にその瞬間、現行のJ3セルにその入力した英字と同じ値を表示させ次の処理に移行する方法にて上手くいかないかなと思っております。 上記のマクロを使用して追加組み込みをする前提で考えると、どういうコードを追加すれば実現出来ますでしょうか? どうかご伝授頂けますと幸いです。 よろしくお願い申しあげます。

専門家に質問してみよう