• ベストアンサー

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

前回と前々回の質問で、マクロを作成していただき とても作業が楽になったのですが、一部変更してもらいたい点があり 再度質問させていただきます(何度も申し訳ありません) 自分でなんとかできないかと思ったのですが、どうにもできず・・すみません。 前回の質問へのリンク: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)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.6

#3です。#3はロジックがごたごたしていたのが気になって、再度考えて、少しすっきりさせました。 #3と同じ例でデ-タでテスト ーー コード Sub test02() d = Range("D65536").End(xlUp).Row '最下行数取得 Ln = 5 '初期状態の意味で4以上をセット For i = 1 To d '最下行以内で繰り返し p = InStr(Cells(i, "D"), "(") '(を探す If p <> 0 Then '(があったとき If Ln > 4 Then Ln = 0 '塊内の4行目以下なら最初の(ありはln=0にして k = i '塊の中の第1行を記録する End If End If Ln = Ln + 1 '塊内の行番号を1加える Select Case Ln Case 1, 2, 3 '塊内の第1,2,3行目では x = Split(Cells(i, "D"), "(") '(でセルの値分離 j = Ln + 4 'E,H,I Cells(k, j) = Mid(Cells(i, "D"), 1, p - 1) 'E列などへセット Cells(k, j + 3) = Mid(Cells(i, "D"), p + 1, Len(Cells(i, "D")) - p - 1) Case 4 '塊内の第4行目は z = Split(Cells(i, "D"), "/") '/で分離 For j = 11 To 11 + UBound(z) - 1 'K-Q列にセットの繰り返し Cells(k, j) = Mid(z(j - 11), 3, Len(z(j - 11)) - 2) Next j Case Else '塊内の第5行目以下は '何もしない End Select Next i End Sub

tricktrick
質問者

お礼

申し訳ございません、上の補足の内容は間違いです・・・お礼の欄に失礼します。 色々試しているうちに、D1に数字(数字)というのが入っていたせいでエラーがでておりました。 なお、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
質問者

補足

マクロ作成ありがとうございます。 データの内容の詳細について、ANo.8に補足してありますますので もしよろしければご覧くださいませ。 今回試した際のデータの状態は次のとおりです A1 数字 D1:D5 空欄 D6:D10 4つの塊 A11 数字 D11:D13 空欄 D14:D17 4つの塊 このデータの状態で試しました マクロを実行したところ、次のようにエラーが出ました。 実行時エラー'5': プロシージャの呼び出し、または引数が不正です。 デバックをすると Cells(k, j) = Mid(Cells(i, "D"), 1, p - 1) 'E列などへセット 上の部分が黄色になります。 実際に書き出されたのは下記の通りです D1のセルにある 数字1(数字2) E1に数字1、H1に数字2 それ以外は書き出す事ができませんでした。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.5

ANo.4です。 自信はありませんが、たぶんこうではないかと解釈してトライしました。 Sub TRY()  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 7)    Set RegExp = CreateObject("VBScript.Regexp")  RegExp.Pattern = "\d+"  RegExp.Global = True  Set rs = Range("A1"): 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)         Set rs = Union(rs, rr.Offset(, -3))         If WorksheetFunction.Count(rs) > 0 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 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            rr.Item(1).Offset(, 1).Resize(, UBound(v, 2)).Value = v            Set rs = 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      If rs Is Nothing Then         Set rs = r.Offset(, -3)      Else         Set rs = Union(rs, r.Offset(, -3))      End If  Next  Set RegExp = Nothing  Set rr = Nothing  Set rs = Nothing  Erase v End Sub 不具合があればご指摘願います。

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

ANo.1です。 何となく条件を取り違えていたようですので、#1はスル~して下さい。 データの塊の区切りに必ず空白行があるかどうかで分かれそうです。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

基本的なことがわからない。前質問の D1 20(150) D2 300(100) D3 40(60) ・・ はシート1にあるとすると、横(行方向)に組み替えた結果を出しのは シート1においてか?シート2(別シート)か? どうも同一シートのE列より右列にらしいですね。 ーー 今回の質問の質問の >A列に数字が入っている行 とは これも元データと同一シートの上のE列より右列にか? それと>列に数字が入っている行とは D1 20(150) D2 300(100) D3 40(60) ・・・ D8 10(50) D9 200(200) D10 30(90) ・・ のD1とか、D8の行のことを言うのか? むしろ塊ごとの最初の数字行の横にというべきことか? 前質問の「完璧な」回答はE-Q列は、どういう行にだして 居たのか。 ーーー ルール性が前質問にも十分説明されていないと思う。 D1、D8,・・を捕まえるのはどういう風に考えればよいのか。 各塊(行のまとまり)においてで、D列セルで(が最初に含むセルを 各塊の最初と見てよいのか。 >上の例では3個ですが、4個だったり5個だったりランダムです) とあるので各塊の行数は一定しない(7ではない)ということですね。 下記では、曜日の入った行は1行、それまでのD1-D3のようなデータは3行に決まっているとする。 良くわからないが下記やってみた。前回答と違うので、質問者は混乱するかも知れない。ソウであれば、下記を無視しても結構。 しかし下記で私はロジックには苦労した。 ーー 例データ D1:D22 20(150) 300(100) 40(60) 月 10 / 火 15 / 水 200 / 木 50 / 金 52 / 土 20 / 日 100 / 空欄 全角文字 半角数字 10(50) 200(200) 30(90) 月 30 / 火 18 / 水 100 / 木 150 / 金 352 / 土 120 / 日 150 / 全角文字 空欄 全角文字 半角数字 全角文字 10(50) 200(200) 30(90) 月 40 / 火 20 / 水 120 / 木 160 / 金 35 / 土 137 / 日 155 / 全角文字 半角数字 ーー コード Sub test01() d = Range("D65536").End(xlUp).Row '最下行数取得 i = 1 While i < d + 1 '最下行以内で繰り返し p = InStr(Cells(i, "D"), "(") '(を探す If p <> 0 Then '(があったとき j = 5 'E列以右で始点列E列指定 For k = i To i + 2 '(ありは続き3列と仮定 p = InStr(Cells(k, "D"), "(") '(あるか If p <> 0 Then '(あり x = Split(Cells(k, "D"), "(") '(でセルの値分離 Cells(i, j) = Mid(Cells(k, "D"), 1, p - 1) 'E列などへセット Cells(i, j + 3) = Mid(Cells(k, "D"), p + 1, Len(Cells(k, "D")) - p - 1) j = j + 1 '次のサイクル End If Next k '(ありの3行の塊の内の次の行を対象 y = Cells(i + 3, "D") '(ありの3行の塊の後の次の行を対象 z = Split(y, "/") '/で分離 For j = 11 To 11 + UBound(z) - 1 'K-Q列にセットの繰り返し Cells(i, j) = Mid(z(j - 11), 3, Len(z(j - 11)) - 2) Next j i = i + 3 '(ありの3行済ましたので End If i = i + 1 '(がなかったときはここへ合流、次の行の処理に移る Wend End Sub ーーー 結果 第1行E列以右 20 300 40 150 100 60 10 15 200 50 52 20 100 第8行E列以右 10 200 30 50 200 90 30 18 100 150 352 120 150 第17行E列以右 10 200 30 50 200 90 40 20 120 160 35 137 155

全文を見る
すると、全ての回答が全文表示されます。
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.2

失礼します。 下記のようにしてみました。 Sub test2()   Dim RegExp As Object   Dim r As Range   Dim rr As Range, rs As Range   Dim i As Integer, j As Integer   Dim k 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 rs Is Nothing Then       k = k + 1       If k = 1 Then Set rs = r       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 Not rs Is Nothing Then       If r.row = rs.Offset(4).row Then         Set rs = Nothing         k = 0         i = 7       End If     End If   Next   Set RegExp = Nothing   Set rr = Nothing   Erase v End Sub

全文を見る
すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

ようは「A列が""でなければいい」と言う事でもいいんですよね? If InStr(r.Value, "(") And rr Is Nothing Then を If InStr(r.Value, "(") And rr Is Nothing And r.Offset(, -3).Value <> "" Then では。

全文を見る
すると、全ての回答が全文表示されます。

関連する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セルにその入力した英字と同じ値を表示させ次の処理に移行する方法にて上手くいかないかなと思っております。 上記のマクロを使用して追加組み込みをする前提で考えると、どういうコードを追加すれば実現出来ますでしょうか? どうかご伝授頂けますと幸いです。 よろしくお願い申しあげます。

専門家に質問してみよう