Array配列についての教えてください

このQ&Aのポイント
  • 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

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

  • ベストアンサー
  • xls88
  • ベストアンサー率56% (669/1189)
回答No.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

masayuu1
質問者

お礼

色々とありがとうございました。 本当に助かりました。 デバックエラーの件は下記のようにVALUE→TEXTに置き換えることで 回避出来ました。 → If st.Range(s).Text = rng.Text Then ありがとうございました。

その他の回答 (2)

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

>回答番号:No.1 この回答への補足 Excelには「マクロの記録」という素晴らしい道具があります。 A1セルを選択、Shiftキー+A10セルをクリック Ctrlキー+C1セルをクリック Shiftキー+C10セルをクリック といった操作を「マクロの記録」すれば答えが解ると思います。

masayuu1
質問者

補足

すみません・・・(>_<) お恥ずかしい限りです。ありがとうございました。 ところが実行すると下記コードでデバックエラーが出るのですが 原因が何とも判りません。 → If st.Range(s.Address).Value = rng.Value Then '★ 宜しくお願い致します。

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

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

masayuu1
質問者

補足

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列の同じ行にその時刻が入るように書き直したいのですが、どうすればいいのでしょうか? すいませんが、よろしくお願いします。

  • 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 です。 試行錯誤しましたが変な結果になって手詰まりしてます。 コード書いてもらえるとすごく助かります! 回答お願いします!

  • 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

  • エクセルマクロ文で、赤文字セルは保持、黒のセル文字削除する方法

    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 このマクロ文は、連続検索し、一致するすべて文字を赤色にするものです。赤文字セルは保持、黒のセル文字を削除する方法を教えてくれませんか?

  • 背景を条件付きで色を付けたい

    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列の背景は条件付き書式で色付けしています。

  • in_array

    $a=array("あ"); $b= "あ" $c=in_array($a,$b) if( この処理の時に、あの前と後の値を指定したい場合なんて書きますか? (2)あが2つ連続であった場合は違う処理をしたいです。その場合どう書けば良いですか?

    • ベストアンサー
    • PHP
  • エクセルのマクロで、複数の写真をセルの中央に

    エクセルのマクロにて下記のようなことをしたいと思っています。 ご教授お願いします。 なお、以前に出ていた回答をベースにしたいと考えています。そのコードも下記に載せておきます。 やりたいこと (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で実行したらいいと思うのですが。

  • エクセル 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 宜しくお願い致します。

専門家に質問してみよう