• ベストアンサー

書いたコードが思惑通りに動かないです。

アクティブシートのセル値を"データ"シートに転記するコードのつもりです。 If Cells(gyou, "CB").Value = 0 Then Exit Sub で変更したセルの行のCB列が零なら処理を終了してほしいのにそのまま処理が続く点と、 kennsakekka = Application.WorksheetFunction.Match(banngou, x, 0) を使って重複の有無を確認し、上書きや処理中止の選択をしたいのですが、重複の有無にかかわらず転記されます。 特別エラーは出ないため、原因が分からず困っています。 不具合の原因がどこにあるのか教えていただけないでしょうか。 Private Sub Worksheet_Change(ByVal Target As Range) Dim gyou, katann, banngou, kennsakekka, x gyou = Target.Row If Target.Column <> 6 Then Exit Sub 'F列以外の変更なら処理を終了 If Cells(gyou, "CB").Value = 0 Then Exit Sub '変更したセルの行のCB列が零なら処理を終了 x = Worksheets("データ").Range("$A$2:$A$65536")   'xにシート"データ"のセル範囲を入れる banngou = Target.Value katann = Worksheets("データ").Cells(Rows.Count, "A").End(xlUp).Offset(1).Row kennsakekka = Application.WorksheetFunction.Match(banngou, x, 0) If kennsakekka = "" Then '重複項目がない場合はシート"データ"の終端の1つ下の行に転記 Worksheets("データ").Cells(katann, "A").Value = ActiveSheet.Cells(gyou, "CA").Value Else Dim ans As Integer ans = MsgBox("記入済の番号です。上書きしますか?", vbYesNo + vbExclamation, "確認してください") Select Case ans Case vbYes     'はいを選択したらMatchで見つけた行に上書き Worksheets("データ").Cells(kennsakekka, "A").Value = ActiveSheet.Cells(gyou, "CA").Value Case vbNo     'いいえを選択したら処理を終わる Exit Sub End Select End If End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 配列を入れるという意味が分かりません。 >x = Worksheets("データ").Range("$A$2:$A$65536") Set x = Worksheets("データ").Range("$A$2:$A$65536") 以下は、ありえないです。 >kennsakekka = Application.WorksheetFunction.Match(banngou, x, 0) >If kennsakekka = "" Then このコードの感じからすると、 kennsakekka = Application.Match(banngou, x, 0) If IsError(kennsakekka) Then シートモジュールですから、 Worksheets("データ").Cells(katann, "A").Value = Cells(gyou, "CA").Value ということかな? If MsgBox("記入済の番号です。上書きしますか?", vbYesNo + vbExclamation, "確認してください") = vbYes Then Worksheets("データ").Cells(kennsakekka, "A").Value = Cells(gyou, "CA").Value End If End If それをまとめてみると、以下のようになります。ただ、F列に入力して、CA列をデータ・シートにコピーするのに、F列の値で、重複を調べるというのは、なんだか意味が良く分からないです。 Private Sub Worksheet_Change(ByVal Target As Range)   Dim gyou As Long, katann As Long, banngou As Variant   Dim kennsakekka As Variant   Dim x As Range      If Target.Column <> 6 Then Exit Sub 'F行   If Target.Count > 1 Then Exit Sub 'セルを二つ以上選択した場合   If Target.Value = "" Then Exit Sub 'データの空の場合      gyou = Target.Row      If Cells(gyou, "CB").Value = 0 Or Cells(gyou, "CB").Value = "" Then Exit Sub      Set x = Worksheets("データ").Range("A1:A65536")   'xにシート"データ"のセル範囲を入れる      banngou = Target.Value 'F列のデータ      kennsakekka = Application.Match(banngou, x, 0)      If IsError(kennsakekka) Then      Worksheets("データ").Cells(Rows.Count, "A").End(xlUp).Offset(1).Value = _      Cells(gyou, "CA").Value   Else     If MsgBox("記入済の番号です。上書きしますか?", _     vbYesNo + vbExclamation, "確認してください") = vbYes Then        Worksheets("データ").Cells(kennsakekka, "A").Value = _        Cells(gyou, "CA").Value     End If   End If End Sub

kobuta2008
質問者

お礼

返事が遅くなりました。 説明不足にも関わらず親切なアドバイスありがとうございます。 これからいただいた意見を参考に試し、結果をお伝えします。 >x = Worksheets("データ").Range("$A$2:$A$65536")と Set x = Worksheets("データ").Range("$A$2:$A$65536")の違いがわからないのですが、Setの有無で意味が全然違うということなのでしょうね。これから調べます。 同じコードのシートが複数あり、記入された情報をvlookup関数で取得するためにデータシートにまとめています。 入力されたデータの転記はVBAで賄えるのかもしれませんが、今の私の力では少し複雑なコードになりそうなので、他のセルたちに入力された値をもとに、一度普通の関数で必要な情報をCA列からCGにまとめ(実際に転記させるセルは複数あります)、その値を転記するだけのコードを書くことにしました。 F列に入力された数値もそのうちの1つで、vlookupで検索する値で、転記するセル群の1つに入力されています。F列の値で検索よりも、CA列の値で重複検索をする形にしておけば理解していただけたかもしれませんね。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 #2の回答者です。真夜中だったので、私の回答が雑だったかもしれません。 >>x = Worksheets("データ").Range("$A$2:$A$65536")と >Set x = Worksheets("データ").Range("$A$2:$A$65536")の違いがわからないのですが、Setの有無で意味が全然違うということなのでしょうね。 これは、VBAなどの 旧VB系の特徴です。今回は、その後で、MATCH関数を使っていますから、MATCH 関数は、2次元配列は受け取れません。MATCH(検索値,範囲、オプション)ですから、範囲は、Range 型でないといけませんね。 いっそうのこと、全部、VBAで作ってしまったほうが、逆に、楽なのかなとは思いますが、 >今の私の力では少し複雑なコードになりそうなので、 今のレベルからなら、そんなに心配ないと思います。今の内容自体まで作れる方なら、後は、回答者さんたちのアドバイスで、問題なく、出来上がると思いますね。大丈夫です! もう少し、細かいところが分かると良いのですが、当面の返事だけつけておきます。

kobuta2008
質問者

お礼

できました!! 教えてもらった If IsError(kennsakekka) Then に変えたら思惑通りに動きました♪ 上書きする選択をした時、実際に重複している行の1つ上の行に上書きされたので Set x = Worksheets("データ").Range("$A$1:$A$65536") と検索範囲をA1からに変更しました。 上書き先を Worksheets("データ").Cells(kennsakekka, "A").Value = としていしているのに、項目行を省いた$A$2:$A$65536が指定範囲ではずれが生じるのは当然でしたね。 本当に助かりました。 1つ謝らなければならない事があります。 実は昨日作業していた時のコード記入先シートと、試験操作で使用したシートが違っていました。いくらコードを訂正しても変化が起こるはずもないどうしようもないミスでした。 作成中のファイルはまだ未完成で、これからいろいろ試しながら完成を目指す予定です。 お世話になりました。

noname#79209
noname#79209
回答No.1

当てずっぽうですが... Cells(gyou, "CB").Value が「0」でなく「""」とか...

kobuta2008
質問者

お礼

回答ありがとうございます。 確かに、そのセルにはif関数が入っています。 0から""に変えてやってみます。

関連するQ&A

  • VBAでコードの編集が上手くいきません

    先日、ご回答頂いたコードを元に自分でいじっているのですが上手く行きません 自分が変更したコード シート1→シート名:変更箇所 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target.Address <> "$C$40" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target.Address <> "$C$42" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target.Address <> "$C$44" Then Exit Sub If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value End Sub シート2→シート名:リスト Private Sub worksheet_change(ByVal Target As Excel.Range) Dim i As Long, c As Long Dim h As Range, ha As Range Dim myDic As Object Set ha = Application.Intersect(Target, Range("A:C")) If ha Is Nothing Then Exit Sub Set ha = Application.Intersect(ha.EntireColumn, Range("1:1")) For Each h In ha Set myDic = CreateObject("Scripting.Dictionary") If h.Column = 1 Then c = 3 'A列→C列 If h.Column = 2 Then c = 4 'B列→D列 If h.Column = 3 Then c = 6 'C列→F列 On Error Resume Next For i = 2 To Cells.SpecialCells(xlCellTypeLastCell).Row If Cells(i, h.Column) <> "" Then myDic.Add Cells(i, h.Column).Value, Cells(i, h.Column).Value End If Next i With Worksheets("変更箇所").Cells(40, c).EntireColumn.Validation .Delete .Add Type:=xlValidateList, Formula1:=Join(myDic.keys, ",") End With Set myDic = Nothing Next End Sub シート1において$C$40または$C$42または$C$44のいずれかを変更した場合 最後に変更したセルに対し、シート2にオートフィルタ―がかかる様にしたいと思っています。 試しにシート1を以下のように編集したところ、思った動作を行ったのですが $C$40または$C$42または$C$44のいずれかのセルを空白にすると エラーがでてしまいます。 Private Sub worksheet_change(ByVal Target As Excel.Range) If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value If Target = "" Then Worksheets("リスト").AutoFilterMode = False: Exit Sub Worksheets("リスト").Range("A:C").AutoFilter field:=1, Criteria1:=Target.Value End Sub Then Exit Subをどう編集すれば上手く動作するでしょうか?

  • 同じブックのシート間でセルの値を転記するヒントが欲しいです。

    excel2002で牛の繁殖・肥育データの管理をしています。 1つのブックに"繁殖牛データ""肥育牛データ""種付け台帳のひな形"というシートがあり、"種付け台帳のひな形"シートは、コピーして繁殖牛の頭数分に増える予定です(コピーしたシートの名前はそれぞれ母牛の5桁の数字に変更します)。 "繁殖牛データ"    A    B   C   D  E 5 個体番号 生年月日 父 祖父 曾祖父 6 7 ・ ・ 1004 "種付け台帳" G2に繁殖牛の番号を入力   B   D  E  F ・・ CA   CB  CC CD CE CF CG 6 日付 種類 性別 種の名前 個体番号 性別 生年月日 母 父 祖父 7 1/2 人工   精液1 8 10/2 分娩 ♂  01234 =$F8 =$E8 =$B8 =$G$2 =$F7 9 双子 ♂  56789 =$F9 =$E9 =$B8 =$G$2 =$F7 10 12/2 人工 精液2 11 9/20 分娩 ♀ 02345 =$F1 =$E11 =$B11 =$G$2 =$F10 ・ ・ 100 "肥育牛データ"   A B   C    D E F G 3 個体番号 性別 生年月日 母 父 祖父 曾祖父 4 ・ ・ 母牛の頭数分ある"種付け用"では人工授精と分娩の記録がなされ、D列が"分娩"もしくは"双子"の時だけCAからCGに必要な値を入れる式を入れています。 "肥育牛データ"シートに生まれた子牛のデータを入れたいのですが、 vlookupでは複数シートからの検索が出来ない事がわかり、VBAの勉強を始めました。 コードは書いてみたものの、エラーどころか何も動きを見せてくれなくて困っています。間違いだらけだろうとは思うのですが、参考書を見ただけでは具体的な間違いを見つけられないのでアドバイスお願いします。 下記コードは、シートをコピーした際にコードも一緒に複製されるだろうと思って"種付け台帳のひな形"というシートの部分に書いています。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Column <> 4 Then Exit Sub If Target.Value <> "分娩" Or Target.Value <> "双子(2)" Then Exit Sub Dim gyou As Variant, katann As Variant gyou = Target.Row katann = Worksheets("データ").Range.End(xlDown) Worksheets("データ").Cells(katann, "A").Value = ActiveSheet.Cells(gyou, "CA").Value Worksheets("データ").Cells(katann, "B").Value = ActiveSheet.Cells(gyou, "CB").Value Worksheets("データ").Cells(katann, "C").Value = ActiveSheet.Cells(gyou, "CC").Value Worksheets("データ").Cells(katann, "D").Value = ActiveSheet.Cells(gyou, "CD").Value Worksheets("データ").Cells(katann, "E").Value = ActiveSheet.Cells(gyou, "CE").Value Worksheets("データ").Cells(katann, "F").Value = ActiveSheet.Cells(gyou, "CF").Value Worksheets("データ").Cells(katann, "G").Value = ActiveSheet.Cells(gyou, "CG").Value End Sub

  • Exit Subでコードを抜け出したい

    If textbox.value "" Then X1 = textbox.Value For i = 1 To 100 X2 = ws.Cells(i, 1).Value If X1 = X2 Then Holder = i Exit For End If If X1 <= X2 Then Holder = i Exit For End If Next i End If 上記のようなコードがあります。textboxというテキストボックスの中の文字列とExcelのセルの文字列を比較して処理を行いたいと思っています。X1=X2、もしくはX1 <=X2の時ループを抜けます。 これに追加して、X1=X2、X1<=X2以外にこれにあてはまらない文字列がある場合は処理を中止してexit subをしたいと思っています。 わからないのは、ExcelのセルのA列から100行を検索して、その結果上記の二つの条件を満たさない場合は"データがありません"でexit subをしたいと思っています。どこにexit subで抜けるようなコードを追加すればよいでしょうか?

  • Excel VBAで検索(Win2000 Excel2000)

    現在、下記のようなコードを書いています。データテーブルの縦と横の検索値を探してその列数と行数を返したいのですが、下記の Sub検索1 と Sub検索2 を1つのSubで実行させるにはどうしたらよいのでしょうか?よろしくお願い致します。 ----------------------------------------- Sub 検索1() Worksheets("Data").Activate Dim x As Integer For x = 3 To 22 If Cells(2, x).Value >= 12 Then MsgBox x Exit Sub End If Next MsgBox "見つかりません" End Sub --------------------------------------------- Sub 検索2() Worksheets("Data").Activate Dim i As Integer For i = 4 To 42 If Cells(i, 2).Value = "A" Then MsgBox i Exit Sub End If Next MsgBox "見つかりません" End Sub

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

    お世話になります。 下記コードで、セルごとにクリアをすると、エラーなくうごくのですが、セルをまとめてセルを消すと実行時エラー13型が一致しません。とでてIf Target.Value = "" Thenがだめだよとでてしまいます。 どなたか、回避の方法をご教授ください。 宜しくお願いいたします。 Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2:E2,G2:J2")) Is Nothing Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo 'Range("B2").Value = x + Z Z = Target.Offset(1, 0).Value y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With Target.Offset(1, 0).Value = x + Z End Sub

  • DTPickerで入力したらの検索が出来なくなりました。

    お世話になります。 質問ですが 以下のVBAコードがあります。Sheet3のCells(2, 6)に記入した日付によってSheet1の検索を一部行うのですが、Cells(2, 6)への入力をDTPickerを使って行うようにしたら該当する日付がありませんのエラーが帰ってきます。たぶん書式が違うせいかなと思うのですがどうすればいいのでしょうか? どなたか分かる方いらっしゃいますか?よろしくお願いします。  Private Sub CommandButton1_Click() Dim trgA As Variant, trgB As Variant With Worksheets("Sheet3") If IsEmpty(.Cells(2, 7)) Then MsgBox "個数が空です。", vbCritical: Exit Sub '日付 trgA = Application.Match(.Cells(2, 6).Value2, Worksheets("Sheet1").Range("A:A"), 0) If IsError(trgA) Then MsgBox "該当する日付がありません。", vbCritical: Exit Sub '製品名 trgB = Application.Match(.Cells(2, 4).Value, Worksheets("Sheet1").Range("2:2"), 0) If IsError(trgB) Then MsgBox "該当する製品名がありません。", vbCritical: Exit Sub If Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = "" Then Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = .Cells(2, 7).Value Else If MsgBox("上書きしますか", vbQuestion + vbOKCancel) = vbOK Then Worksheets("Sheet1").Cells(trgA, trgB + 1).Value = .Cells(2, 7).Value End If End If End With End Sub

  • 実行時エラー'1004'で困っています。

    少し前にも同じコードの他の点についてアドバイスをいただいたのですが、新たな問題点が生じたので改めて質問させてほしいです。 具体的な問題点が分からなかったのでコードをそのまま載せました。 シート1に値を入力すると、繁殖牛データ。データ。という2個のシートから検索し、リンクをつけたいです。 繁殖牛データシートに入っている値を入力した時は ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'繁殖牛データ'!" & Range(Cells(kennsaku, 3)) データシートに入っている値を入力した時は ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'" & データ & "'!" & Range(Cells(kennsaku, 1)) で「'Range'メソッドは失敗しました:'_Worksheet'オブジェクト」とでます。 試験的にどちらのシートにも入っていない値を入力すると、思惑通りに"見つからないのでリンクは貼りません"と帰ってきます。 Private Sub Worksheet_Change(ByVal Target As Range) Dim kennsaku, y, z If Target.Count > 1 Then Exit Sub 'セルを二つ以上選択した場合 If Target.Value = "" Then Exit Sub 'データが空の場合 If Application.CountIf(Range("A1:Z80"), Target.Value) > 1 Then MsgBox Target.Value & "は既に入力されています", vbOKOnly + vbExclamation Target.Clear Exit Sub End If Set y = Worksheets("繁殖牛データ").Range("$C$1:$C$1003") Set z = Worksheets("データ").Range("$A$1:$A$65536") kennsaku = Application.Match(Target.Value, y, 0) If IsNumeric(kennsaku) Then ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'繁殖牛データ'!" & Range(Cells(kennsaku, 3)) Else kennsaku = Application.Match(Target.Value, z, 0) If IsError(kennsaku) Then MsgBox "見つからないのでリンクは貼りません", vbOKOnly + vbExclamation Exit Sub Else ActiveSheet.Hyperlinks.Add anchor:=Target, Address:="", SubAddress:="'" & データ & "'!" & Range(Cells(kennsaku, 1)) End If End If Range("A1:Z80").Font.Underline = False End Sub

  • 指定セルを別ブックへ貼り付ける作業

    1.現在、見積書.xlsの見積汎用シートで以下の内容で同じブックのデータベース貼付シートに貼り付けています。 Sub データベース貼付() GYOU = Worksheets("データベース").Range("A65536").End(xlUp).Row + 1 Worksheets("データベース").Cells(GYOU, 1).Value = Range("H13").Value Worksheets("データベース").Cells(GYOU, 2).Value = Range("C8").Value Worksheets("データベース").Cells(GYOU, 3).Value = Range("C6").Value Worksheets("データベース").Cells(GYOU, 4).Value = Range("C15").Value Worksheets("データベース").Cells(GYOU, 5).Value = Range("D15").Value Worksheets("データベース").Cells(GYOU, 6).Value = Range("E15").Value Worksheets("データベース").Cells(GYOU, 7).Value = Range("G30").Value Worksheets("データベース").Cells(GYOU, 8).Value = Range("H1").Value 2.これを見積書.xlsの見積汎用シートを別ブックのデータベース.xlsのデータシートに貼り付けたいと思います。 3.以下の内容で仮に自分で貼り付けてみようとしましたがうまくいきません。 Sub コピーしてすべて貼り付ける() Workbooks("見積書.xls").Worksheets("見積汎用").Range(D6).Copy _ Workbooks("データベース.xls").Worksheets("データ").Range(B4) End Sub どのように、別ブックに指定したセルを貼り付けできるでしょうか?いろいろとサイトを見ましたがどうもうまくできませんでした。 説明がわかりづらく申し訳ないですが、どなたか教えていただけないでしょうか? よろしくお願い致します。

  • こんばんは、watabe007さん。

    961awaawaです。 >シートモジュールに貼り付けてお試しください。 Private Sub Worksheet_Change(ByVal Target As Range) With Target If Intersect(.Cells, Range("L:M")) Is Nothing Then Exit Sub If .Row < 3 Or .Value = "" Then Exit Sub If Not IsNumeric(.Value) Then Exit Sub .Offset(, 3).Value = Cells(.Row, .Value).Value End With End Sub というソースを作って頂いたのですが、既に各sheetにprivate sub からなるソースが入ってましてコンパイルエラー(名前が適切ではありません Worksheet_Change)となります。他に方法等頂けましたらありがたいです。

  • エクセルのコード表示についてですが。。

    Private Sub Worksheet_Change(ByVal Target As Range) (1)If Target.Column <> 4 Then Exit Sub Target.Offset(0, -3) = Now()   ⇒特定のセルに日時自動表示 (2)If Target.Column <> 4 Then Exit Sub  Target.Offset(0, 1) = "DUMMY"  ⇒特定のセルにDUMMYと自動表示 (3)If Target.Column = 4 Then  Target.Offset(0, -2) = "1"  Else             ⇒特定のセルに1と自動表示   (4)If Target.Column = 35 Then  Target.Offset(0, -2) = "2"  ⇒特定のセルに2と自動表示  End If  End If (5)If Target.Value = "T" Or Target.Value = "t" Then  Target.Value = "田中"    ⇒Tと入力すると田中と変換して表示  ElseIf Target.Value = "H" Or Target.Value = "h" Then  Target.Value = "林"     ⇒hと入力すると林と変換して表示  End If  End Sub 上のようなコードを入力すると(3)と(5)が機能しません。。なぜでしょうか??コードの表示がまずいのでしょうか??

専門家に質問してみよう