Array配列についての教えてください
- Array配列について教えてください。重複を防止するためにどのようなコードを使用すればいいですか?
- 指定した範囲のセルを処理対照セルと比較対照セルとして使用する方法を教えてください。
- 指定した範囲のセルを処理対照セルと比較対照セルとして使用する際の注意点を教えてください。
- ベストアンサー
Array配列について教えてください。
重複を防止する為に当サイトにて伝授頂きました。 付きましては、下記コードの c_in = Array("A1", "A2", "A3", "A4", "A5") '//処理対照セル名を列記(入力セル) c_cmp = Array("A1", "A2", "A3", "A4", "A5") '//比較対照セル名を列記(参照セル) の Array("A1"・・・) 部分を A1:A500 若しくは A列全体 としたいのですが、方法はありますでしょうか? 宜しくお願いいたします。 ・・・コード・・・ Sub Code_Check(s_ad As String) Dim st As Worksheet, rng As Range, flag As Boolean Dim i As Long, s, c_in, c_cmp Set rng = ActiveSheet.Range(s_ad) On Error Resume Next If rng.Value = "" Then Exit Sub On Error GoTo 0 c_in = Array("A1", "A2", "A3", "A4", "A5") '//処理対照セル名を列記(入力セル) c_cmp = Array("A1", "A2", "A3", "A4", "A5") '//比較対照セル名を列記(参照セル) flag = True i = LBound(c_in) '//処理対照セルかどうかを判定 While flag And (i <= UBound(c_in)) If rng.Address = Range(c_in(i)).Address Then flag = False i = i + 1 Wend If flag Then Exit Sub '//ブック内の全シートについて比較 For Each st In Worksheets For Each s In c_cmp If st.Range(s).Value = rng.Value Then If (st.Name <> ActiveSheet.Name) Or (st.Range(s).Address <> rng.Address) Then MsgBox ("重複エラー!!" & Chr(13) & "" & Chr(13) & "入力した受注番号は当BOOK内に既に存在します!確認して下さい!") Exit Sub End If End If Next s Next st End Sub
- masayuu1
- お礼率45% (10/22)
- オフィス系ソフト
- 回答数3
- ありがとう数1
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
当方ではエラーは再現できませんでしたが不具合がありました。 Set c_in = Range("A1:A500,C1:C500") '//処理対照セル名を列記(入力セル) '★ Set c_cmp = Range("A1:A500,C1:C500") '//比較対照セル名を列記(参照セル) '★ と、指定しても 下記のところでは、A1:A500からC1:C500とならずに、A1:A1000となるようです。 i = 1 '★ '//処理対照セルかどうかを判定 While flag And (i <= c_in.Count) '★ If rng.Address = c_in(i).Address Then flag = False i = i + 1 Wend 折角のRange型参照を活用して、下記のようにしてください。 希望が叶うと思います。 '//処理対照セルかどうかを判定 For Each s In c_cmp If rng.Address = s.Address Then flag = False: Exit For Next
その他の回答 (2)
- xls88
- ベストアンサー率56% (669/1189)
>回答番号:No.1 この回答への補足 Excelには「マクロの記録」という素晴らしい道具があります。 A1セルを選択、Shiftキー+A10セルをクリック Ctrlキー+C1セルをクリック Shiftキー+C10セルをクリック といった操作を「マクロの記録」すれば答えが解ると思います。
補足
すみません・・・(>_<) お恥ずかしい限りです。ありがとうございました。 ところが実行すると下記コードでデバックエラーが出るのですが 原因が何とも判りません。 → If st.Range(s.Address).Value = rng.Value Then '★ 宜しくお願い致します。
- xls88
- ベストアンサー率56% (669/1189)
Range型に直します。 Sub Code_Check(s_ad As String) Dim st As Worksheet, rng As Range, flag As Boolean Dim i As Long, s Dim c_in As Range, c_cmp As Range '★ Set rng = ActiveSheet.Range(s_ad) On Error Resume Next If rng.Value = "" Then Exit Sub On Error GoTo 0 Set c_in = Range("A1:A500") '//処理対照セル名を列記(入力セル) '★ Set c_cmp = Range("A1:A500") '//比較対照セル名を列記(参照セル) '★ flag = True i = 1 '★ '//処理対照セルかどうかを判定 While flag And (i <= c_in.Count) '★ If rng.Address = c_in(i).Address Then flag = False i = i + 1 Wend If flag Then Exit Sub '//ブック内の全シートについて比較 For Each st In Worksheets For Each s In c_cmp If st.Range(s.Address).Value = rng.Value Then '★ If (st.Name <> ActiveSheet.Name) Or (st.Range(s.Address).Address <> rng.Address) Then '★ MsgBox ("重複エラー!!" & Chr(13) & "" & Chr(13) & _ "入力した受注番号は当BOOK内に既に存在します!確認して下さい!") Exit Sub End If End If Next s Next st End Sub
補足
xls88さん 返信ありがとうございます。 バッチリです!助かりました。ありがとうございます。 もうひとつだけ聞きたいのですが・・・ Range("A1:A500") ← 連続した対象範囲が複数の時は Range("A1:A500","C1:C500") ← ここの所をどのようにすれば いいのでしょうか? すみませんが、どうか宜しくお願い致します。
関連するQ&A
- CollectionとArrayの呼び出し順
こんばんは。 いつも勉強させてもらっています。 ご教授ください。 セル範囲A1:B3に適当な値を入れ 下記のコードを実行してみました。 ----------------------------------------------- Sub Test() Dim Rng As Range Dim myRange As Range Set myRange = Range("A1").CurrentRegion For Each Rng In myRange Debug.Print "Collection: " & Rng.Value Next Rng Dim Ary Dim myArray myArray = Range("A1").CurrentRegion.Value For Each Ary In myArray Debug.Print "Array: " & Ary Next Ary End Sub ----------------------------------------------- その結果、 Collectionの場合は、 A1>B1 >A2>B2 >A3>B3 Arrayの場合は、 A1>A2>A3 >B1>B2>B3 の順で呼び出されました。 なぜこのような違いがでるのか分かりません。 教えてください。 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- エクセル VBA の質問です。
A2~A20までのセルに文字を入力した段階で、それぞれB2~B20に入力日時を入れるVBAを以下のように組んでいます。 しかし、同様の条件を同一シートのE2~E20・F2~F20にも入力・自動表示できるようにしなければならなくなり、困っています。 どのように記述を変えればよいのか、教えていただけたらと思います。 宜しく御願いいたします。 Sub Worksheet_change(ByVal Target As Range) Dim Rng As Range Dim c As Range Set Rng = Range("A2:A20") If Intersect(Target,Rng) Is Nothing Then Exit Sub For Each c In Intersect(Target,Rng) If Not IsEmpty(c) Then c.Offset(, 1).Value = Now Else c.Offset(, 1).ClearContents End If Next Rng.Offset(, 1).EntireColumn.AutoFit End Sub 申し訳ありませんが、何卒、宜しく御願いいたします。
- ベストアンサー
- オフィス系ソフト
- VBAの記録を追加したい
エクセル2002使用です。 VBAで次のコードを使っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim Rng As Range Set Target = Intersect(Range("C:C"), Target) If Target Is Nothing Then Exit Sub For Each Rng In Target If Rng.Value <> "" Then Rng.Offset(, -2).Value = Now Else ' (*) Rng.Offset(, -2).Value = "" ' (*) End If Next Rng End Sub (C列のセルに何か入力されると、A列の同じ行にその時刻が入る。) 同じシートで、F列に何か入力されるとE列の同じ行にその時刻が入るように書き直したいのですが、どうすればいいのでしょうか? すいませんが、よろしくお願いします。
- ベストアンサー
- Visual Basic
- VBA教えてください
VBA初心者です 画像を添付します 赤いセルの背景色に反応し、 C~Eのセルを結合してその中に文字を入れると言うものですが 10/1みたいに全て結合出来れば良いのですが コードを実行した結果 10/5の結果はC~Eのセルは結合されてますが 列の9~11のセルは結合されてないです これをまとめて結合出来るようにしたいです (10/1の結合セルみたいな事をしたいです) コード sub test() const hani as string="A1:E11" dim rng as range for each rng in range(hani) if rng.interior.colorindex= 3 then range(cells(rng.row,3),cells(rng.row,5)).merge cells(rng.row,3).value="停止" end if next rng end sub です。 試行錯誤しましたが変な結果になって手詰まりしてます。 コード書いてもらえるとすごく助かります! 回答お願いします!
- ベストアンサー
- Visual Basic
- VBA 範囲選択時エラー
Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー 型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub
- 締切済み
- Visual Basic
- エクセルマクロ文で、赤文字セルは保持、黒のセル文字削除する方法
For Each rng In Range("G2:G25") If rng.Value <> "" Then Set out = Range("A2:E111").Find(rng.Value) If Not out Is Nothing Then igo = out.Address End If Do While Not out Is Nothing out.Font.ColorIndex = 3 Set out = Range("A2:E111").FindNext(out) If igo = out.Address Then Exit Do End If Loop End If Next このマクロ文は、連続検索し、一致するすべて文字を赤色にするものです。赤文字セルは保持、黒のセル文字を削除する方法を教えてくれませんか?
- ベストアンサー
- Visual Basic
- 背景を条件付きで色を付けたい
Sub test() Dim Rng As Range For Each Rng In Range("I7:I756") If Rng.Interior.ColorIndex = xlNone Then Cells(Rng.Row, 1).Resize(, 6).Interior.ColorIndex = 35 End If Next End Sub 上記のコードだとうまくいきません>< データベースがA7:K756まであり、I 列の背景が何もない場合のみ その行のAからFまでのセルを薄い緑の背景にしたいのです。 例えばI10の背景がない場合はA10.B10.C10.D10.E10.F10のセルを薄い緑する といった感じにしたいのですがVBAはあまり詳しくないので 詳しい方ぜひアドバイスお願いします。 エクセル2010を使っています。 補足 I列の背景は条件付き書式で色付けしています。
- ベストアンサー
- Visual Basic
- エクセルのマクロで、複数の写真をセルの中央に
エクセルのマクロにて下記のようなことをしたいと思っています。 ご教授お願いします。 なお、以前に出ていた回答をベースにしたいと考えています。そのコードも下記に載せておきます。 やりたいこと (1).複数の写真がある (2).1枚目の写真はB1に貼り付けている (3).同様にn枚目の写真はBnに貼り付けている(今現在300枚、今後増える予定) ここまではもうやっています。この後が問題なのですが (4).Bnのセルの中で、写真をセルの中央に移動させたい この(4)ができず困っています。既出で参考にした回答は下記です。 下記に手を加えていただき、(4)ができるようにしていただければ助かるのですが。 よろしくお願いいたします。 http://okwave.jp/qa/q3875596.html 参考にしたコード Sub picCenter() Dim p As Object Dim rng, trg As Range Const adr As String = "A26" '処理対象セルの左上のアドレス If Range(adr).MergeCells Then Set rng = Range(adr).MergeArea Else Set rng = Range(adr) End If For Each p In ActiveSheet.Pictures Set trg = Intersect(rng, p.TopLeftCell) If Not trg Is Nothing Then If p.Width < rng.Width Then p.Left = rng.Left + (rng.Width - p.Width) / 2 End If If p.Height < rng.Height Then p.Top = rng.Top + (rng.Height - p.Height) / 2 End If End If Next p End Sub この中の Const adr As String = "A26" '処理対象セルの左上のアドレス という箇所を、for-next関数でたとえばi=1からi=500とし セル番地Biで実行したらいいと思うのですが。
- ベストアンサー
- その他MS Office製品
- エクセル 2010 マクロ 検索
http://okwave.jp/qa/q8562170.html 上記質問に追加です。 ※1 'D,E,F,G,H,I,K を検索してD,E,F,G,H,I に検索対象があった時 E,F,G,H,Iのいずれかだったら左横列の上に向かって (EならD 、FならE ・・・という具合に) 何か入力されているセルのM列の191000####をmsgboxで表示させたいです。 (画 F11セル(A-1)が検索ヒットした場合E9セル(R-01)を辿り、 その行のM列のセル(191000####)をmsgboxで表示 ※2 但し、検索結果がD列のデータだった時、その行のM列が191000####だった場合 M列の191000####をmsgboxで表示させたいです。 (画 D25セル(Y-1)対象の時) ※3 また、検索結果がD列のデータだった時、その行のM列が191000####以外だった場合 (空白だったり191000####以外の場合) M列の一番上の191000####をmsgboxで 191000####&「これは例外です」と表示させたいです。 (画 D24セル (X-1)対象の時) 現在のコードは下記のとおりです。 Sheet1に Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Address <> "$A$3" Then Exit Sub Call 検索 Range("A1:A2").Clear Range("A1").Activate End Sub 標準モジュールに Sub 検索() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim strKey As Variant Dim s As String Dim c As Range, bln As Boolean Dim rng1 As Range Dim cnt As Long Set Ws1 = Sheet1 Set Ws2 = Sheet2 Ws1.Select With Ws2 strKey = Application.Transpose(.Range("A1").Resize(2).Value) strKey = Join(strKey, "") End With If Trim(strKey) = "" Then MsgBox "検索キーが空です", vbCritical: Exit Sub With Ws1 Set rng1 = .Range("K2", .Cells(Rows.Count, "K").End(xlUp)) For Each c In rng1.Offset(, -10) 'D,E,F,G,H,I,Kを検索 s = c.Offset(0, 3).Value & c.Offset(0, 4).Value & c.Offset(0, 5).Value & c.Offset(0, 6).Value & c.Offset(0, 7).Value & c.Offset(0, 8).Value & c.Offset(0, 10).Value & If StrComp(s, strKey, vbTextCompare) = 0 And c.Offset(0, 2).Value = "" Then c.End(xlToRight).Activate c.Offset(0, 2).Value = Date c.Resize(1, 14).Interior.ColorIndex = 6 bln = True Exit For End If Next c If Not bln Then Ws2.Select MsgBox "リストに存在しません", vbExclamation, "NotFound" Else '加える Call ReSearch(Ws1.Range("M2"), c.Row) '再設定 Set rng1 = .Range("K6", .Cells(Rows.Count, "K").End(xlUp)) MsgBox "残り" & DoubleCountBlank(rng1.Offset(, -8), rng1) & "品目です。", vbInformation End If End With Application.Goto Ws2.Range("A1"), True End Sub Sub ReSearch(Rng As Range, j As Long) '最初のセル, 終わりの行数 Dim i As Long Dim Ws As Worksheet With Rng.Parent For i = j To Rng.Row Step -1 If CStr(.Cells(i, Rng.Column).Value) Like "191000####" Then MsgBox "指図番号 " & vbCrLf & CStr(.Cells(i, Rng.Column).Value) & " の部品です" Exit For End If Next i End With End Sub Function DoubleCountBlank(rng1 As Range, rng2 As Range) '横並びのセルのブランクをカウントする (セル範囲1 , セル範囲2) Dim i As Long Dim cnt As Long For i = 1 To rng1.Rows.Count If VarType(rng2.Cells(i, 1)) = vbDouble Then If rng1.Cells(i, 1).Value = "" And rng2.Cells(i, 1).Value <> 0 Then cnt = cnt + 1 End If End If Next i DoubleCountBlank = cnt End Function 宜しくお願い致します。
- ベストアンサー
- Excel(エクセル)
お礼
色々とありがとうございました。 本当に助かりました。 デバックエラーの件は下記のようにVALUE→TEXTに置き換えることで 回避出来ました。 → If st.Range(s).Text = rng.Text Then ありがとうございました。