• 締切済み

A B C

A B C コード 商品 単価 1 チョコレート 100 2 キャンディー 50 3 ガム 80 4 スナック菓子 150 5 乳製品 170 上記表の下にデータを追加していきたいのですが、その際重複データの入力及びコピーもできないようにしたいと思います。 Private Sub CommandButton1_Click() Dim endrow As Long Dim i As Integer endrow = Range("商品").Columns(1).CurrentRegion.Rows.Count Range("商品").Rows(endrow + 1).Columns(1).Value = TextBox1.Value Range("商品").Rows(endrow + 1).Columns(2).Value = TextBox2.Value Range("商品").Rows(endrow + 1).Columns(3).Value = TextBox3.Value TextBox1.Value = Clear TextBox2.Value = Clear TextBox3.Value = Clear With Range("A2") For i = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(i, 0) = .Offset(i - 1, 0) Then .Offset(i, 0).EntireRow.Delete Next i End With End Sub すぐ上の行と同じ場合には入力ができませんが、それ以外での重複している場合の入力を回避する為の改善箇所をご教示の程お願い致します。(コードが同じで入力不可)

みんなの回答

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

ついでに、こちらにも回答を入れておきます。 >コードが同じで入力不可 なら、このようになるはずです。 テキストボックスは、コントロールツールを想定しています。 テキストボックスに入力した時に、次に移動するためのマクロも付けておきます。 当該シートのモジュールに登録してください。 Private Sub CommandButton1_Click()  Dim endrow As Long  Dim myAr(0 To 2) As Variant  Dim ret As Variant  Dim i As Long  endrow = Cells(Rows.Count, 1).End(xlUp).Row  If TextBox1.Value <> "" Then   myAr(0) = Val(TextBox1.Value) '数値でなかったら、Valを外す  Else   Exit Sub  End If  If TextBox2.Value <> "" Then   myAr(1) = TextBox2.Value  Else   Exit Sub  End If  If TextBox3.Value <> "" And IsNumeric(TextBox3.Value) Then   myAr(2) = TextBox3.Value  Else   Exit Sub  End If  'コードで比較  ret = Application.Match(myAr(0), Columns(1), 0)  If IsNumeric(ret) Then MsgBox "既に登録しています。", vbExclamation: Exit Sub  Cells(endrow + 1, 1).Resize(, 3).Value = myAr  For i = 1 To 3   Me.OLEObjects("TextBox" & i).Object.Value = ""  Next End Sub Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  If KeyCode = 13 Or KeyCode = 9 Then   TextBox2.Activate  End If End Sub Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)  If KeyCode = 13 Or KeyCode = 9 Then   TextBox3.Activate  End If End Sub

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

コピーの禁止のやり方(コード)は判らない。 多分質問者のレベルでは考えられないことではないかな。 ーー 重複登録は、コマンドボタンをクリックした時(すなわち追加したいとなったとき) テキストボックスからデータを採るのらしいから、その値が商品範囲の決った列に無いかどうかチェックしたら仕舞いでは。そのやり方がわからないというのか。長々と読者に我流の質問コードを読ませないで、「したくて出来ないこと」を文章でズバリ書くこと。 ーー 重複しているかのチェックは (1)総なめで既存項目といま追加しようとしている項目が同じかどうか比較していく (2)Findメソッドを使う (3)VBAのMATCH関数を使い見つからないエラーなら登録

関連するQ&A

  • 入力時エラーメッセージの出し方

    http://oshiete1.goo.ne.jp/qa3745129.htmlを参考に 下記の構文を作りましたが、エラーメッセージが出せなく困っています。 フォームで入力を行う際に、該当ボックスで車番一覧にデータの無いものに関してエラーメッセージを出したいと考えています。 修正箇所に関してご指摘いただければと思います。 よろしくお願いします。 Private Sub CommandButton1_Click() Dim check As Long '重複の有無(=0:重複せず,>0:重複) With Cells(Rows.Count, 1).End(xlUp).Offset(1) .Value = TextBox1.Text .Offset(0, 1).Value = TextBox2.Text .Offset(0, 2).Value = TextBox3.Text .Offset(0, 4).Value = TextBox4.Text On Error Resume Next check = 0 check = WorksheetFunction.Match(CInt(TextBox2.Text), Range("車番一覧", Columns(1))) On Error GoTo 0 If check = 0 Then MsgBox "その車番は登録されていません!", vbExclamation, "入力エラー" TextBox2.SetFocus Exit Sub End If Exit Sub End With TextBox1.Text = "" TextBox2.Text = "" TextBox3.Text = "" TextBox4.Text = "" If TextBox1.Text = "" Then TextBox1.SetFocus End If Range("A1").Sort Key1:=Range("A1"), order1:=xlAscending, Key2:=Range("A1"), order2:=xlAscending, Header:=xlGuess End Sub

  • エクセル 何故かシート間の値のコピーが出来ない

    いつもお世話になります。 開いているブックのシート「リスト1~3」に、Book1.xlsの「リスト1~3」の値をコピーする為に、下記のマクロを作成しました。 Dim SH1, SH2, SH3, SH4, SH5, SH6 As Worksheet Set SH1 = ThisWorkbook.Worksheets("リスト1") Set SH2 = ThisWorkbook.Worksheets("リスト2") Set SH3 = ThisWorkbook.Worksheets("リスト3") Set SH4 = Workbooks("Book1.xls").Worksheets("リスト1") Set SH5 = Workbooks("Book1.xls").Worksheets("リスト2") Set SH6 = Workbooks("Book1.xls").Worksheets("リスト3") 'リスト1をコピーする D = SH4.Range("A1").CurrentRegion.Rows.Count E = SH4.Range("A1").CurrentRegion.Columns.Count SH1.Range(Cells(1, 1), Cells(D, E)).Value = SH4.Range("A1").CurrentRegion.Value 'リスト2をコピーする F = SH5.Range("A1").CurrentRegion.Rows.Count G = SH5.Range("A1").CurrentRegion.Columns.Count SH2.Range(Cells(1, 1), Cells(F, G)).Value = SH5.Range("A1").CurrentRegion.Value 'リスト3をコピーする H = SH6.Range("A1").CurrentRegion.Rows.Count I = SH6.Range("A1").CurrentRegion.Columns.Count SH3.Range(Cells(1, 1), Cells(H, I)).Value = SH6.Range("A1").CurrentRegion.Value 以上を実行すると、「アプリケーション定義またはオブジェクト定義のエラーです」とエラーメッセージが出てしまいます。 それぞれのシートの処理の時に、 SH1.Select SH2.Select SH3.Select を入れて、シートを選択してから実行すると問題なく動くのですが、何故このようなことが起こるのでしょう?

  • EXCEL VBA

    EXCEL VBAで空白行が現れたら「小計」の文字を入力したいと思い以下のように記述しましたが、うまくいきません。どこがおかしいのか教えてください。 宜しくお願いします。 Sub write小計() Dim i As Integer Dim rowcnt As Integer rowcnt = Cells(1, 1).CurrentRegion.Rows.Count Range("B1").Select For i = 1 To rowcnt If Cells(i, 2).Value = "" Then Value = "小 計" ActiveCell.Offset(1).Select Next i End Sub

  • EXCEL VBA 早く処理をする

    よろしくお願いします 下の構文を標準モジュールに書き込み、callで実行しているのですが 処理に時間がかかります。 処理を早くする方法と構文の簡素化のご教示をお願いします。 Application.ScreenUpdating = False For i = 1 To 12 With Worksheets(i) .Select LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A8:G" & LastRow).Sort Key1:=Range("A8"), order1:=xlAscending .Range("G8:G" & LastRow - 1).Formula = "=G7+E8-F8" LastRow = .Range("A150").End(xlUp).Row + 1 .Range("A" & LastRow).Select Dim EndRow As Long EndRow = .Range("A" & Rows.Count).End(xlUp).Row Cells(Rows.Count, 1).End(xlUp).Offset(1, 3) = .Name & "合計" Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) = Application.WorksheetFunction.Sum(Range("E7:E" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) = Application.WorksheetFunction.Sum(Range("F7:F" & EndRow)) Cells(Rows.Count, 1).End(xlUp).Offset(2, 3) = "前月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) = .Range("G7") Cells(Rows.Count, 1).End(xlUp).Offset(2, 5) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 4) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 3) = "次月繰越" Cells(Rows.Count, 1).End(xlUp).Offset(4, 3) = "合計" Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) - Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(4, 4) = Cells(Rows.Count, 1).End(xlUp).Offset(2, 4) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 4) Cells(Rows.Count, 1).End(xlUp).Offset(4, 5) = Cells(Rows.Count, 1).End(xlUp).Offset(3, 5) + Cells(Rows.Count, 1).End(xlUp).Offset(1, 5) Cells(Rows.Count, 1).End(xlUp).Offset(1, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(2, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(3, 6) = "" Cells(Rows.Count, 1).End(xlUp).Offset(4, 6) = Cells(Rows.Count, 1).End(xlUp).Offset(0, 6) .Range("C7").End(xlDown).Select Selection.Offset(4, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 2).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 3).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(4, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(4, 4).Borders(xlEdgeBottom).LineStyle = xlDouble Selection.Offset(0, 2).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 2).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 2).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 3).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 3).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 3).Borders(xlEdgeBottom).Weight = xlThin Selection.Offset(0, 4).Borders(xlEdgeTop).Weight = xlHairline Selection.Offset(0, 4).Borders(xlEdgeBottom).LineStyle = xlContinuous Selection.Offset(0, 4).Borders(xlEdgeBottom).Weight = xlThin End With Next i Application.ScreenUpdating = True

  • excel vbaでの質問になります

    このようなマクロを作成したのですが、セルに数式が入れてあると、どうしてもその下の空白の行に値を入力されてしまいます。 数式が入っているセルにもそのままセルに値を入れたいのですが・・ 宜しくお願いします。 Dim wb1 As Worksheet, r1 As Range Dim N As Integer, i As Integer Dim mycount As Long   Set wb1 = ThisWorkbook.Worksheets("請求書") mycount = Range("B111").CurrentRegion.Rows.Count Cells(111 + mycount, 2).Select ActiveCell.Offset(0, 0).Value = wb1.Range("C60").Value ActiveCell.Offset(0, 1).Value = wb1.Range("C61").Value ActiveCell.Offset(0, 12).Value = wb1.Range("C66").Value ActiveCell.Offset(0, 13).Value = wb1.Range("C74").Value ActiveCell.Offset(0, 14).Value = wb1.Range("C75").Value ActiveCell.Offset(0, 15).Value = wb1.Range("C84").Value ActiveCell.Offset(0, 16).Value = wb1.Range("C85").Value ActiveCell.Offset(0, 20).Value = wb1.Range("C69").Value ActiveCell.Offset(0, 22).Value = wb1.Range("C68").Value ActiveCell.Offset(0, 23).Value = wb1.Range("C76").Value ActiveCell.Offset(0, 24).Value = wb1.Range("C77").Value Exit Sub

  • エクセルのマクロで重複データーを削除する

    Sub Sample() Dim i As Long With Range("B:B") For i = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(i, 0) = .Offset(i - 1, 0) Then .Offset(i, 0).EntireRow.Delete Next i End With End Sub 上記のマクロを実行するとエラーがでますが、どこを直せばわかりません。 一つのブックのシート全体のB列の重複データーを削除したいのですが、教えて頂けないでしょうか?

  • VBAコピー範囲について教えてください。

    VBAのコピーペーストの下記プログラムで、 Sub コピー() Dim rng As Range Set rng = Worksheets("2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) With Range("b2:J10") rng.Resize(.Rows.Count, .Columns.Count).Value = .Value End With End Sub コピー範囲 のJ10の部分(データ入力行)が、その都度変わるため、J10の部分を、 J列のデータが入力されている最終行としたいのですが、どのようなプログラムに すればよいのでしょうか。 どなたかよろしくお願いいたします。

  • VBA AutoFilter 範囲指定

    いつもお世話になっております 過去に https://okwave.jp/qa/q9707059.html にてワークシートのデータをオートフィルターをかけて別なワークシートにデータを取り出す方法を教えて頂きました 送られてくる元データが変更になって、A3セルの上のA2セルの上にテキスト文字が入るようになったので、範囲指定を正しく出来るようにする方法を https://okwave.jp/qa/q9708868.html にて教えて頂きました 今回、https://okwave.jp/qa/q9707059.htmlで教えて頂いたワークシートのコードを実行させると元データが変更になったデータを利用すると、A1セルまで含まれた範囲がAutoFilter の領域と判断される為正しい結果となりません 添付画像のワークシートで Sub test9() Worksheets("Sheet1").Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=Cells(5, "G").Value End Sub を実行させれば、"秋田”でフィルターがきちんとかけれらた状態になります そこで教えて頂いたコードを下記に変更して実行させてみたのですが Dim i As Long With Worksheets("Sheet1") .Range("B4", .Range("B4").End(xlDown)).Copy .Range("G4").PasteSpecial (xlPasteAll) .Range("G4", .Range("G4").End(xlDown)).RemoveDuplicates Columns:=Array(1), Header:=xlNo For i = 4 To .Cells(Rows.Count, "G").End(xlUp).Row Worksheets.Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = .Cells(i, "G").Value .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value .Cells(3, 1).CurrentRegion.Copy Destination:=Worksheets(.Cells(i, "G").Value).Cells(3, 1) .AutoFilterMode = False Next .Range(Cells(3, "A"), Cells(Range("A3").CurrentRegion.Rows.Count, Range("A3").CurrentRegion.Columns.Count)) _ .AutoFilter Field:=2, Criteria1:=.Cells(i, "G").Value 部分で 実行時エラー'1004' アプリケーション定義またはオブジェクト定義のエラーです になってしまいます 元データがA2セルにテキスト文字が入った状態でも正常にコード動作させるにはどのようにしたらいいのでしょうか よろしくお願い致します

  • 連続プルダウンについて

    VBAで初心者でリストを作るのがやっとで連続プルダウンができません 各月のシートに登録ボタン作成あります。登録ボタンを押して商品を登録する際に、大分類を選んだら、選んだ大分類の中分類を選べ、中分類を選んだら小分類を選べるようにしたいです。 そのために、Sheet1に分類の表を作成しました。 例えば、大分類で梱包作業用品を選んだら、     中分類には梱包/結束用品かテープ製品が選べて、中分類で梱包/結束用品を選んだら     小分類で緩衝材か養生用テープが選べる様にしたいです。 どうか教えて下さい。 ----------------------------------------------------------- Private Sub CommandButton1_Click() Dim lRow As Long Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet With ws lRow = .Range("B" & Rows.Count).End(xlUp).Row .Range("B" & lRow + 1).Value = TextBox1.Value lRow = Range("C" & Rows.Count).End(xlUp).Row .Range("C" & lRow + 1).Value = ListBox1.Value lRow = .Range("D" & Rows.Count).End(xlUp).Row .Range("D" & lRow + 1).Value = TextBox2.Value lRow = .Range("E" & Rows.Count).End(xlUp).Row .Range("E" & lRow + 1).Value = TextBox3.Value lRow = .Range("F" & Rows.Count).End(xlUp).Row .Range("F" & lRow + 1).Value = TextBox4.Value lRow = .Range("G" & Rows.Count).End(xlUp).Row .Range("G" & lRow + 1).Value = TextBox5.Value 'lRow = .Range("I" & Rows.Count).End(xlUp).Row '.Range("I" & lRow + 1).Value = TextBox6.Value lRow = Range("I" & Rows.Count).End(xlUp).Row .Range("I" & lRow + 1).Value = ListBox3.Value lRow = .Range("J" & Rows.Count).End(xlUp).Row .Range("J" & lRow + 1).Value = TextBox7.Value lRow = .Range("K" & Rows.Count).End(xlUp).Row .Range("K" & lRow + 1).Value = TextBox8.Value lRow = Range("L" & Rows.Count).End(xlUp).Row Range("L" & lRow + 1).Value = ListBox2.Value lRow = .Range("H" & Rows.Count).End(xlUp).Row .Range("H" & lRow + 1).Value = TextBox9.Value End With TextBox1.Value = "" TextBox1.SetFocus TextBox2.Value = "" TextBox2.SetFocus TextBox3.Value = "" TextBox3.SetFocus TextBox4.Value = "" TextBox4.SetFocus TextBox5.Value = "" TextBox5.SetFocus 'TextBox6.Value = "" 'TextBox6.SetFocus TextBox7.Value = "" TextBox7.SetFocus TextBox8.Value = "" TextBox8.SetFocus TextBox9.Value = "" TextBox9.SetFocus End Sub Private Sub UserForm_Initialize() With ListBox1 .AddItem "たのめーる" .AddItem "AMAZON" .AddItem "楽天" .AddItem "yahooショッピング" .AddItem "国峰印房" .AddItem "脇製茶" .AddItem "ヤマト運輸" .AddItem "ゼネラル" .AddItem "家電量販店" End With With ListBox2 .AddItem "総務課" .AddItem "用度" .AddItem "営業" .AddItem "介護" .AddItem "倉庫" .AddItem "人事" .AddItem "経理" End With With ListBox3 .AddItem "梱包作業用品" .AddItem "事務用品消耗品" .AddItem "パソコン用品消耗品" .AddItem "プリンター用品消耗品" .AddItem "掃除用品消耗品" .AddItem "衛生用品消耗品" .AddItem "消臭用品消耗品" .AddItem "洗剤用品消耗品" .AddItem "事務用品" .AddItem "掃除用品" .AddItem "生活雑貨用品" .AddItem "飲食用品" .AddItem "パソコン周辺機器" .AddItem "生活雑貨" .AddItem "医療機器" .AddItem "電化製品" .AddItem "衛生用品" .AddItem "日用品" .AddItem "出版物" .AddItem "家具" End With End Sub

  • 大量のデータを条件付で抜き出してコピー&ペーストしたいんですが、データが多すぎるので…

    VBA初心者なんですが、下の添付画像のデータなんで、名前が一致する商品の2番8番の数値を名前の数だけ抜き出してコピーしていきたいんですが、下のように一つ一つまとめていくと、余りにも名前の数が多いのでいつまでたっても終わりません。 何かいい方法はないでしょうか?ちなみに名前の数は300くらいあります。 Dim targetRange As Range Set targetRange = Range("A5").CurrentRegion Set targetRange = targetRange.Resize(targetRange.Rows _ .Count - 1, 1).Offset(1) Range("A1") = Format (Application.WorksheetFunction.SumIf(targetRange _ .Offset(, 0), "paab01865", targetRange.Offset(, 3)) _ , "#,###") Set targetRange = Nothing Dim targetRange As Range Set targetRange = Range("A5").CurrentRegion Set targetRange = targetRange.Resize(targetRange.Rows _ .Count - 1, 1).Offset(1) Range("B1") = Format (Application.WorksheetFunction.SumIf(targetRange _ .Offset(, 0), "paab01865", targetRange.Offset(, 8)) _ , "#,###") Set targetRange = Nothing 何かいい方法がありましたら、お教えください。

専門家に質問してみよう