
前回と前々回の質問で、マクロを作成していただき
とても作業が楽になったのですが、一部変更してもらいたい点があり
再度質問させていただきます(何度も申し訳ありません)
自分でなんとかできないかと思ったのですが、どうにもできず・・すみません。
前回の質問へのリンク: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
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
これかな?
毎回迅速な対応ありがとうございます。
希望通りの動きでした。
前々回から長々とつきあわせてしまい、本当に申し訳ありませんでした。
あきれずに対処していただけて、本当に感謝しております。
ご協力いただけた皆様に良回答をつけたいのですが
良回答と次点の2名しか選べませんので、申し訳ありませんが今回のようにさせて頂きました。
皆様本当に本当に、どうもありがとうございました!!
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
この回答への補足
何度もマクロを作成していただき、本当にどうもありがとうございました。
希望通りの動きとなり、大満足です。
質問を締め切る際、再度ポイント発行させていただきます。
この度は本当にどうもありがとうございました。
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
結構ごちゃごちゃしてますが。
(正規表現使わなければもう少し行が減るかな?⇒単なる好みと思って下さい。)
この回答への補足
希望通りの動きとなり、大満足です。
前々回から、本当に本当にどうもありがとうございました。
あつかましいのですが、もう一つお願いしてもよろしいでしょうか…
新しくスレッドを作るべきかと思ったのですが
無関係という訳ではないのでこちらでお願いしたいと思います。
今回のマクロを実行したあと、必要なデータは全て
A列に数字のある行に入った状態となります。
A列が空欄の行(数字が入っていない行)と、
データを抜き取ったD列を全て削除したいのですが
そのマクロを作っていただけないでしょうか。
今回作っていただいたマクロを実行した後、
データがきちんと書き出されているかある程度目で確認したいので
今回のマクロに組み込んでいただくのではなく
別のマクロとして組んでいただければ助かります。
本当に何度もあつかましいのですが、よろしければお願いいたします。
すみません、説明不足な気がしたので再度お礼欄で失礼します…
A列が空欄の行を全て削除=削除後は上にシフトする状態
D列を全て削除=削除後は左にシフトする状態(今までのE列がD列になる状態)
こういう意味です。
D列の削除くらいは手動でやっても大した作業ではありませんので
こちらはスルーしていただいてもかまいません。
お手数おかけしますが、よろしくお願いします。
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列のデータに明らかにされていない形のものがあるのではないでしょうか。
この回答への補足
再作成ありがとうございます。
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)
No.13
- 回答日時:
ANo.10の補足について。
こちらでテストした範囲ではデータ【数値(数値)】の()が全角の場合にエラーになりましたが。
ただxls88さんのコードで同様のエラーが出ていないのが少し不思議な感じがしました。
たぶん未熟故の事でしょうから、私はお手上げですね。
この回答への補足
何度も申し訳ないです・・
データの状態で、書き漏れしているのはC列の内容になります。
C列にC列に半角英数(数字)という記載があったせいでした。
(必ず入っているという訳ではありませんが、今回試したデータのC2がそのセルでした)
C列のセルの内容は、各テーブルの一番上の行(Aに数字が入ってる行)以外は
一切必要ないので、最初に「(」でC列を検索して、該当するセルを消去したところ
ANo.7の補足に書いた結果とまったく同じく
D列の4つの塊の先頭行のE~Qに書き出される形となりました。
xls88さんが書いてくれたANo.7のマクロでは、エラーはでないのですが
C列のセルに半角英数(数字)という記載があった場合
そのテーブルのみ展開されず、次のテーブルは展開されました
申し訳ございません、上の補足の内容は間違いです・・・お礼の欄に失礼します。
色々試しているうちに、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に書き出したい)
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に数字というような感じです)
ということですから、新しい仕様に対応するようにコードを見直す必要があります。
No.11
- 回答日時:
ANo.9です。
>試した時にA1に数字があり、D1~D5まで空欄がある状態でした。
この条件でテストした所エラーは出てませんので、詳細はデータがなければわかりません。
(提示ではなく、ファイルのことです。)
何か提示されていないデータの存在があるものと推測するくらいです。
あとは実際のファイルでデバッグしていくしかないですが、それは私には無理です。
書き出す位置については、#10の通りです。
No.10
- 回答日時:
ANo.8の2回目です。
ここを見落としてました。
>呼び出されているテーブルの始まりがA1(テーブルの一番左上のセル)なので
>その横の欄のE~Qに、D列の4つの塊のセルの内容を書き出せる形になれば
>作業が大変楽になるのですが…
ここが理解できません。
結局E列以降に書き出す行は、何を基準に決まるのですか?
蛇足ですが。
>なんとかなるようでしたら再度作成をお願いいたします。
回答されたコードのテストをされていなくて、再度の作成依頼だと回答する側も落ち込みますよ。
補足の際には注意された方が宜しいかと。
この回答への補足
何度もお手数おかけして申し訳ないです。
テスト結果をちょうど補足で書いていたところでした。遅くなってすみません。
再度#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に…という意味です。
No.9
- 回答日時:
ANo.8です。
言葉だけの説明よりもデータの状態を提示された方が、伝わるかと思います。
で、#5は#8の補足事項に対しては、一応考慮して作成しましたがそれでも無理だったでしょうか。
どのコードでどの部分がエラーになるとか、結果がこう違うとか、その辺りの補足も欲しいかと。
この回答への補足
レスありがとうございます。
#5のマクロを試したところエラーがでて書き出しできない状態です。
実行時エラー'9':
インデックスが有効範囲にありません
と出てます。デバックを選ぶと
v(1, j) = Split(Replace(rr.Item(j).Value, ")", ""), "(")(0)
この部分が黄色になります。
試した時にA1に数字があり、D1~D5まで空欄がある状態でした。
試しにD1~D5を削除し、上にシフトしたところエラーはでなくなったのですが、
その次のE~Qの書き出し先が、Aに数字が入っている行でもなく
D欄の塊の先頭の行でもなく、適当に?書き出されてしまいます。
No.8
- 回答日時:
ANo.5です。
どうも初級レベルの私ですから、コードを複雑化してしまっているようで申し訳ないですし、
やっぱり解釈が違うような気がする。。。?
>A列には数行置きに数字が入っております。数字は全て半角英数です。
>数字以外は、全て空欄のセルです(A1に数字、A2~A5まで空欄、A6に数字というような感じです)
E列以降に書き出すのは、A列に値がある場合のみと解釈していたのですが違うようであればスル~して下さい。
この回答への補足
皆様、レス本当にありがとうございます。
マクロの作成もありがとうございます。
説明不足で申し訳ありません。最新の回答であるこちらのレスに説明させていただきます。
書き出しはすべて同一シート内(アクティブなシート)でという意味です。
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つの塊のセルの内容を書き出せる形になれば
作業が大変楽になるのですが…
上手く説明できずに申し訳ございません<(_ _)>
ご面倒をおかけしますが、なんとかなるようでしたら再度作成をお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 3 2022/08/31 14:09
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) VBAでoutlook365が起動しません。 4 2022/08/25 13:31
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) エラーコード1004 6 2022/06/09 14:12
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) マクロで最終行を取得したい 4 2023/05/28 12:14
- Excel(エクセル) VBAの指示の内容 昨日こちらでご教示頂いたのですが初心者な為、一つ一つの指示が何をやっているのかわ 2 2022/10/25 18:08
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【マクロ】並び替えの範囲が、...
-
Excelで並び替え後にア行...
-
マクロの修正をお願いします
-
矩形範囲の複数列を縦1列に並...
-
Excel VBAについて
-
エクセル データの入力規制「リ...
-
エクセルで二つ困っています
-
【再投稿】指定の文字を含むセ...
-
Excelで、2つの条件の交わった...
-
EXCElで特定の文字列の行をコピー
-
入力したデータのエラーチェッ...
-
excel VBA のコードを編集したい
-
Excel VBA オートフィルター 期...
-
エクセルで、ある列の共通する...
-
エクセル関数について
-
二つの表を比べてデータを拠出...
-
複数のエクセルファイルのB列か...
-
エクセル VBA 最初の数字をカッ...
-
エクセル関数で日付の範囲をグ...
-
Excelデータを少し加工して別の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel2017 フィルタ昇順並びがA...
-
【マクロ】並び替えの範囲が、...
-
Excelで並び替え後にア行...
-
エクセルで行の高さ及び列幅の...
-
【Excel VBA】指定した行の最大...
-
オートフィルタ後のデータから...
-
エクセルの時刻のカウントが出...
-
基準日以前のデータを範囲を指...
-
エクセル関数について
-
EXCELで日付を比べ3か月以内の...
-
文字列を比較し、相違するフォ...
-
急ぎ!色のついたセルを非表示...
-
プルダウンに【なし、平均、デ...
-
excel / ピポッド 日数を出したい
-
マクロで行の高さを設定したい
-
VBA 複数行の検索及び抽出
-
エクセル VBA 行間隔を飛ばした...
-
【Excel】数式の参照範囲を可変...
-
時間の重複チェック
-
EXCEL 最終行のデータを他のセ...
おすすめ情報