Excel VBAで題名を固定し、新しいデータを特定のセルから入力する方法

このQ&Aのポイント
  • Excel VBAを使用して、入力シートのデータからDBシートに新しいデータを登録する方法について質問です。
  • DBシートの題名は固定されていますが、新しいデータが追加されると題名が下に移動します。特定のセルから新しいデータが入力されるようにするための方法を知りたいです。
  • 具体的には、入力シートのA2からデータを入力し、それをDBシートに登録したいです。ExcelのVBAに詳しくないため、どのように変更すれば良いかわかりません。
回答を見る
  • ベストアンサー

登録する行の変更

以下のコードで「入力」シートのデータから「DB]シートに登録するんです。「DB」シートの一行目A1は題名ですが新しいデータに入ってくるとどんどん題名は下の行に下がっていく。 題名は固定し、新しいデータはA2から入ってくるようにしたいですがどこに変更すればいいかわからなくて困っています。(ExcelのVBAはまったくわかりません) よろしくお願いします。 Excel 2007 Sub 登録_Click() 'On Error GoTo Err_登録 Dim n As Integer '入力明細の数 Dim x As Long 'DBの検索範囲の最終行 Dim rng As Range '検索したセル Dim z As Long 'DBのデータの最終行 Dim tbl As Worksheet '[DB]シート Dim key As String '検索キー Dim from_key As Long '更新範囲(自) Dim to_key As Long '更新範囲(至) '警告メッセージ非表示 Application.ScreenUpdating = False Worksheets("入力").Activate Set tbl = Sheets("DB") z = tbl.Range("A1").CurrentRegion.Rows.Count Check_登録: key = Range("B2").Value If key = "" Then MsgBox "発注番号が未入力です。" Exit Sub End If '[発注番号]でソート tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlGuess '存在チェック x = tbl.Range("A1").End(xlDown).Row With tbl.Range("A1:A" & x) Set rng = .Find(key, LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If Not rng Is Nothing Then MsgBox "既存の番号が存在します。" Exit Sub End If End With '明細行有無チェック n = WorksheetFunction.CountIf(Range("M46:M65"), "*") If n = 0 Then MsgBox "明細行がありません。" Exit Sub End If Add_登録: '空白行を省く Selection.AutoFilter Field:=14, Criteria1:="<>" 'コピー&貼り付け Range("A47:U66").Copy tbl.Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues '[発注番号]でソート tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlGuess 'コピーモード解除 Application.CutCopyMode = False '空白行を省くを解除 Selection.AutoFilter Field:=14 'ブック保存 'ActiveWorkbook.Save '画面クリア Call 画面クリア '警告メッセージ表示 Application.ScreenUpdating = True Exit_登録: MsgBox "登録しました。" Exit Sub Err_登録: MsgBox "エラーが発生しました

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.3

>>ANo.2 きっと他人が作ったプログラムの修正。貼るしかない気が… ソースは確かに美しくないけどね;; >>ANo.1 あれ、ANo.1じゃダメでした?それとも説明が悪かったかな。。 ダメでしたら、シートの構造と使い方の補足をお願いします。 ◆ANo.1まとめ VBA 24行目と51行目の2箇所を変更してみてください。 (修正前)1行目がタイトルか自動判別  tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlGuess (修正後)1行目をタイトルとする  tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlYes ◆+α 質問とは別件ですが… > '明細行有無チェック > n = WorksheetFunction.CountIf(Range("M46:M65"), "*") M46~M65のセルが、全部空ならエラーにする処理です。 多分、M47~M66の間違いかと。そうなら、"M47:66"に修正シテネ!

その他の回答 (2)

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

こういう質問は、原データが無いので、チェックがしにくい。 どうせ丸投げするなら、文章でやりたいことを書いて質問してくれたほうが(丸投げだが)まだまし。 手本にした(あるいは質問者が弄り回したのかもしれないが)コードは、癖があって、どこかで見習った方法を、総動員した感じで、初心者向けには、勉強に適当ではないと思うし無駄があるように思う。。 (1)研作(未入力チェック 2)ソートーーA列に入っている、発注番号でらしい (3)存在チェックーーA列で。存在チェックはFindでやってなぜ後半はCountIF関数なのかな?    存在チェックにその前のソートは効いているのかな(ソートする必要はあるのかな)   存在チェックそのものも不要に見えるが。 (4)空白行は除く (5)DBシートへの貼り付け と処理が複雑だが ーーー エクセルもVBAも判らないというなら、 For Nextで最初の行から最終行まで(1行ずつ) IFステートメントでその行の内容を判別する。そして その行が条件に合わない行は処理せず(次の行の処理に移り)、 条件に合ったものは、DBシートに1行分の列項目を代入(代入先行を1行ずつ、づらすテクニック要) 必要あれば最後にDBシートで並べ替え の方法が、素直な考え方で、初心者むけだ。

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

#ぱっと見ただけなので、間違ってたらゴメンネですが… > 'コピー&貼り付け > Range("A47:U66").Copy > tbl.Range("A" & z + 1).PasteSpecial Paste:=xlPasteValues > > '[発注番号]でソート > tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlGuess 「入力」のA47:U66を、「DB」の一番 "下" に貼り付けてから、「DB」をA列でソートしてます。 たぶん、ここでタイトル行がデータ扱いされちゃってるんじゃないかな? (修正) > tbl.Range("A1").Sort Key1:=tbl.Range("A1"), Header:=xlYes "Header:=xlGuess" 「タイトル行の有無を自動判別」 から、 "Header:=xlYes" 「先頭行をタイトルと見なす」 に・・・ ソート処理が2箇所あるので、両方とも変更してみてください。 ただ、コレが原因だとしたら、「自動判別できなくなった」のが問題な気がします。 プログラム作成当初とは何かが変わっているんじゃないでしょうか? VBAを直すより、A列を見直してみる方がいいかもです。

nuocngoai
質問者

お礼

ご回答ありがとうございます。 修正したやはり自動判別ができなくなって、入力したデータが混乱してしまいました。 そして、私の言い方が間違いました。A列はタイトルではなく1列はタイトルです。 エクセルは得意ではないですので、どこをどのように見直したらいいかわかならないです。 これは原因かもしれないという点があれば、是非教えて頂きたいです。 よろしくお願いします。

関連するQ&A

  • ExcelVBAで行と列の検索

       A  B  C  D  E 1  コード あ  い  う  え 2  10  ○    ○ 3  20     ○  ○ 4  30          ○ 上記の表が5000件あります。Textbox1に入力し検索ボタンを押すと A列のコードを検索して一致する列の○のあるところの1行目の項目 をtextbox2に表示したいのですがうまく行きません。 よろしくお願い致します。 Private Sub CommandButton1_Click() '検索フォームボタン Dim i As Long Dim 最終行 As String Dim サーチ行 As Long Sheets(1).Activate 最終行 = Range("A1").End(xlDown).Row サーチ行 = 0 For i = 2 To 最終行 If TextBox1.Value = Range("A" & i) Then If Range("B" & i, "N" & i) = "" Then TextBox2.Text = Range("B1", "N1") サーチ行 = i Exit For End If End If Next If サーチ行 = 0 Then MsgBox TextBox1.Value & "データはありません。", vbInformation, "無し" End If TextBox1.SetFocus End Sub エラーはでません。データはありませんとなります。  

  • マクロFind検索で見つからなかった時の対処

    エクセル2013です 以下のコードを作成しましたが .Rowが色で塗られ 「型が違います」でERRになります。 .Columnの方はERRでなく なぜ.Rowの方がERRなのでしょうか? よろしくお願いします。 Dim 検索行番号 As Range Dim 判定列番号 As Range Dim 検索列番号1 As Range Dim 検索列番号2 As Range Set 検索行番号 = Rows(1).Find("みかん").Column If 検索行番号 Is Nothing Then MsgBox "みかんが有りません。" End If Exit Sub Set 判定列番号 = Rows(1).Find("りんご").Column If 判定列番号 Is Nothing Then MsgBox "りんごが有りません。" End If Exit Sub Set 検索列番号1 = Range("B:B").Find("大箱").Row If 検索列番号1 Is Nothing Then MsgBox "大箱が有りません。" End If Exit Sub Set 検索列番号2 = Range("B:B").Find("小箱").Row If 検索列番号2 Is Nothing Then MsgBox "小箱が有りません。" End If Exit Sub

  • ExcelVBAで、広範囲セルの空白チェックをしたいと思います。

    ExcelVBAで、広範囲セルの空白チェックをしたいと思います。 以下のようなExcelシートがあります。 ・10行目まではタイトル行 ・データ入力可能セル範囲はA11~AF65536 全てのデータ範囲を削除するために、以下のコードを作成しました。 動きとしては問題ないのですが、データが存在しない場合の 処理時間が長くなってしまいます。 Sub 全データ削除() Dim endrow As Long Dim mydelete As Integer Dim myrange As Range endrow = Range("A11").End(xlDown).Row For Each myrange In Range("A11:AF" & endrow) If myrange.Value <> "" Then GoTo 削除処理 End If Next myrange MsgBox "データがありません。" Exit Sub 削除処理: mydelete = MsgBox("全てのデータを削除しますか?", vbOKCancel) Select Case mydelete Case vbOK Rows("11:65536").Delete Range("D4").Formula = "=COUNTA(A11:A65536)" MsgBox "データを削除しました。" Exit Sub Case vbCancel MsgBox "キャンセルされました。" Exit Sub End Select End Sub データ範囲が65536行までになってしまうため時間がかかっているのだと思いますが、 回避方法がわかりません。 ご教授お願いいたします。

  • セルが何行なのかをVBAで取得したい

    セルが何行なのかをVBAで取得したいのですが どういうコードにすればいいですか? 例えば、A1セルに a b c と入ってる場合、3行ですが それをVBAで取得するにはどうすればいいですか? Sub test() Dim r As Range Set r = Cells(1, 1) If r.Value Like "*" & Chr(10) & "*" Then MsgBox "改行があります" End If End Sub というコードで改行が有ることは取得できたのですが 何行かまでは取得する方法がわかりません。

  • 空白行の削除マクロについてご教示ください

    空白行の削除に、下記マクロを活用させていただいていますが、 見た目空白なのに削除されない行が時々残ってしまいます。 削除されなかったセルを「Deleteキー」で空白にするとマクロが 実行され、きちんと削除されます。 こういった、スペースか何かが入っていても、見た目空白なら 削除するようにはできないでしょうか。 どなたかよろしくお願いいたします。 Sub 削除() Dim c As Range Dim 開始行 As Long Dim 最終行 As Long 開始行 = 5 最終行 = Range("a5000").End(xlUp).Row For Each c In Range("a" & 開始行 & ":a" & 最終行) If c.Value = "" Then Rows(c.Row).Delete End If Next End Sub

  • 行に色を付ける

    本を片手にやっているのですが 分かっている人にしたらあほみたいなことなんでしょうがよろしくお願いします。 A列には日付B列には曜日(WEEKDAY関数で日曜が1)を入力してあります。土日の行ににピンクを塗りつぶしたいのですが Sub iro() Dim i As Integer, gyou As Long gyou = Range("b65536").End(xlUp).Row For i = 2 To gyou If Range("b65536").End(xlUp).Value = 1 Or 7 Then Rows(i).Interior.ColorIndex = 7 Else Exit For End If Next End Sub なんとなくここまでできたのですが、これだと 全部の行に色がついてしまいます。 何がいけないのでしょうか? よろしくお願いします。

  • エクセル 最終行からの連続コピー

    * すぐに回答を! エクセルC20からI51までデータを1日1行ずつ入力します。 データが入力されている最終行から上に連続する10行(最終行含む)をコピーしたいのですが、最終行から10行上をどのように認識させたらいいのか、わかりません。Offsetなど試してみましたがダメでした。 よろしくお願いします。 Sub dataコピー() Dim i As Long Dim j As Integer Dim rng As Range '最後尾から10行前までを選択 With Worksheets("月").Range(Cells(20, 3), Cells(51, 10)) For i = Cells(Rows.Count, 1).End(xlUp).Row To -10? If rng Is Nothing Then Set rng = .Rows(i) End If j = j + 1 If j >= 10 Then Exit For Next i 'コピー If Not rng Is Nothing Then rng.Copy Range("M1") Beep Else MsgBox "該当行は存在しません。", 48 End If End With Set rng = Nothing End Sub コードはこちらを参考にしました ​http://questionbox.jp.msn.com/qa5440189.html

  • VBAで条件が一致する行のデータを別シートに抽出で…

    QNo.4034421『VBAで条件が一致する行のデータを別シートに抽出』の続きになります。 下記のような記述を前回ご教授賜っていたのですが、Keywrd"a"が無い場合、SubステートメントからExitではなく、 "Sheet2の"A387"の列を空白にしたまま次のプログラムに移行するように"Else"を使用して記述してみたのですが、上手くいきません。 ご教授願えませんでしょうか。 Dim Keywrd As String Dim TargetCell As Range Keywrd = "a" If Keywrd = "" Then Exit Sub With Worksheets("Sheet1").Columns("A:A") Set TargetCell = .Find(Keywrd, LookAt:=xlWhole, LookIn:=xlValues) If TargetCell Is Nothing Then MsgBox Keywrd & " は見つかりません。" Exit Sub End If End With TargetCell.EntireRow.Copy Worksheets("Sheet2").Range("A387") TargetCell.EntireRow.Delete Shift:=xlUp

  • 【EXCEL】UserFormで入力して 重複したデータがあった場合 上書きかキャンセルかを表示させたい。

    現在 Userformで入力して 末行に 登録され 並び替えするだけの マクロをやってます。 これだと同じ商品コードがあった場合 重複されてしまいます。ここで上書きされるようにするにはどうやったらいいのでしょうか? また 重複しています 上書きしますか?という警告表示は出せないでしょうか。よろしくお願いします。 A B 1 商品コード 名前 2 2986 AAAA 3 2987 BBBB 4 2988 cccc 5 2989 dddd 現在の userform のコード Private Sub CommandButton1_Click() Dim cord As String Dim syouhinnmei As String cord = TextBox1.Value syouhinmei = TextBox2.Value If cord = "" Then MsgBox "商品コードを入力してください" Exit Sub End If If syouhinmei = "" Then MsgBox "商品名を登録してください" Exit Sub End If myRow = Worksheets("Sheet1").Cells(65536, 2).End(xlUp).Row + 1 With Worksheets("Sheet1") .Cells(myRow, 1).Value = cord .Cells(myRow, 2).Value = syouhinmei End With Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then _ myCtrl.Value = vbNullString Next Sheets("Sheet1").Select Range("A1:B1").Select Range("A1:B2000").Sort Key1:=Range("A2"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Sheets("Sheet2").Select Range("A1").Select End Sub

  • マクロでのタイトル行の変更

    いつもお世話になります。 添付の画像で タイトル 行で 上側で  氏名 登録日 No は下記のようなマクロが入っています。 Private Sub Worksheet_Change(ByVal Target As Range) On Error GoTo Error If Intersect(Target, Range("B:B")) Is Nothing Then Exit Sub If Target.Offset(0, -1).Value = "" Then Exit Sub If Target.Value <> "" Then Target.Offset(0, 1).Value = Application.Max(Range("C:C")) + 1 End If Error: End Sub 添付の下のように No 登録日 氏名 のように位置を変更は上のマクロのどの部分を 変更すればいいかご教示願えませんか。 宜しく御願いします。 色々と試したのですが分からなくなりました。

専門家に質問してみよう