Excel VBAデータ登録のスピードアップ方法

このQ&Aのポイント
  • ExcelのVBAを使用してデータ登録のスピードを向上させる方法についてアドバイスをお願いします。
  • データを格納するシートとデータの受け渡しを行うシートの間でデータレコードを切り替える際にかかる時間を短縮する方法を教えてください。
  • ExcelのVBAを使用してデータ登録・閲覧・編集を行っていますが、データレコードの切り替えに時間がかかってしまい、作業効率が低下しています。どのように修正すれば良いでしょうか?
回答を見る
  • ベストアンサー

Excel VBAデータ登録のスピードアップしたい

下記のようなコードがあります。 ■input データ閲覧・登録・編集シート ■data データを格納するシート inputシートとdataシートでdataの受け渡しを行っているのですが、データレコードを切り替えるだけで20秒ちょっとかかるため、作業効率が悪いです。 この時間を1~2秒ぐらいまで減らすには、どのように修正すれば、いいでしょうか?どうかアドバイスをお願いいたします。 Private Sub datatouroku() ’データを登録する Dim touroku As Integer Dim fRange As Range Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) touroku = fRange.Row '検索されたNoの行位置を求める Sheets("data").Cells(touroku, 1).Value = Range("BC1:BE1").Value Sheets("data").Cells(touroku, 2).Value = Range("AX1").Value Sheets("data").Cells(touroku, 3).Value = Range("I4").Value   '・・・上記のデータが全部で256件あります。 End Sub ------------------------------------------ Private Sub hyouji() 'データを表示させる Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows)    If (fRange Is Nothing) Then '見つからなかった?    MsgBox "入力された顧客コードが存在しません。", vbExclamation    Exit Sub    End If    kensaku = fRange.Row '検索された顧客DCの行位置を求める     Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value     Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value    Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value     '・・・上記のデータが全部で256件あります。 Set trg = Sheets("data").Cells(kensaku, 1) End Sub

  • puyopa
  • お礼率87% (459/525)

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

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#2です。 >試した結果では、複写範囲が広くなっても、処理時間が比例的に増加する事はありませんでした。 スミマセン。これ嘘でした。実行一回目はコンパイルの関係か、キャッシュの関係か時間がかかるので、見誤っておりましたが、やはりセル数に比例して処理時間は増加します。但し、個々に転送するのに比べて20倍くらい速いです。まとめて転送する事で、セル数がバラの場合の20倍以下でおさまるなら速度アップが期待できます。 この方法の場合は、数式を介しておりますので、再計算は自動のままにしておく必要がありますので、念のため付け加えさせていただきます。 ただ、単純なモデルで試した限りでは、256個の転送程度ならイラっとする程の時間はかからないと思いますので、遅くなる原因は他にあるのかもしれません。要所でGetTickCountを実行して、どこで時間がかかっているのかお調べになってはいかがでしょうか。

参考URL:
http://homepage1.nifty.com/MADIA/vb/API/GetTickCount.htm
puyopa
質問者

お礼

mitarashi様 いつも本当にありがとうございます。既にNO2で頂いた回答で既に劇的に早くなりました。20秒から1秒以下にまで縮まりました。なんてお礼を言ったらよいか・・。なぜこんなに早くなるのか、いまいち理解仕切れていませんので、そこもしっかり勉強していくつもりです。 本当にありがとうございました。

その他の回答 (2)

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

1.まずデータ転記部分を Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ’ここに転記処理を記す Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True で囲むと、処理時間半減位にはなると思います。 2.それ以上の高速化には、範囲まとめて値転写するのが速いと思います。 バラバラのセル→一行書き込みでは、作業用のシートに数式で一旦受けて、一行にまとめる様にしておいて、 Sheets("Sheet3").Rows(1).Value = Sheets("Sheet4").Rows(1).Value といった感じで値のみ代入すれば良いでしょう。 一行→バラバラのセルの場合も、同じセル配置の作業用のシートを設けて、 一行のデータから目的の配置に関数で転記して、 Sheets("Sheet5").Range("A1:T20").Value = Sheets("Sheet4").Range("A1:T20").Value といった感じで、定数的な見出し文字といった情報もひっくるめて目的のシートに値を転記すれば速いと思います。 試した結果では、複写範囲が広くなっても、処理時間が比例的に増加する事はありませんでした。 検索してヒットした行から、作業シートのバラバラのセルに値を移すには、INDEX関数を用いるなり、作業用のシートの所定の行に一旦コピーしても良いでしょう。 なお、この方法だと、転記先のシートの書式情報はそのまま保持されます。 但し、貼付先の書式によっては、転写元の空白が、転写先で0になってしまうといった問題が出るかもしれません。 以上、ご参考まで。

  • mks1902
  • ベストアンサー率40% (11/27)
回答No.1

>If (fRange Is Nothing) Then '見つからなかった? >MsgBox "入力された顧客コードが存在しません。", vbExclamation >Exit Sub >End If 件数が多いとIF~THEN命令は不向きです。私も経験しました。 ヒントとして IF~THEN命令のところをオートフィルタで顧客コードを抽出。 結果をコピーし、別のシートに貼り付け。 counta関数で抽出件数を出す。 0件なら顧客コードが存在しない 1件ならヒット 2件以上なら重複 頑張ってみてください。

puyopa
質問者

お礼

mk1902様 回答ありがとうございました。 まだトライできていませんが、是非活用させていただきたいと思います。 勉強になりました。 ありがとうございます。

関連するQ&A

  • EXCEL VBA エラーの意味が分からず

    いつも、お世話になっております。 下記コードで、レコード1と2を前へと次へを繰り返し何度か操作すると、エラーになってしまいます。なぜエラーになって、どう修正すれば回避できるのかが分かりません。 どうかご教授いただけないでしょうか。よろしくお願いいたします。 エラーの状況 inputシートで、maeとtsugiの動作を何度か行うと、「If pict.TopLeftCell.Address = targetRange.Address Then」の部分が黄色く塗りつぶされ、「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです。」と表示されてしまします。たぶん写真の削除の時にエラーになっているのだと思いますが、 '■標準モジュールのコード。dataシートのレコードを移動し、inputシートのBC1セルに表示する。 Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("A1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() On Error GoTo errhandle If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If Exit Sub errhandle: Call Saisyo End Sub Sub Tsugi() On Error GoTo errhandle If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If Exit Sub errhandle: Call Saigo End Sub Sub Tenki() Worksheets("input").Range("BC1").Value = trg.Offset(0, 0) End Sub '■sheet 1のモジュール。inputシートBC1セルの値を見て、dataシートへ値を読みにいき、inputシートへ表示する。 Private Sub hyouji() Dim fRange As Range Dim kensaku As Long Set fRange = Sheets("data").Columns(1).Find(What:=Range("BC1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If kensaku = fRange.row '検索された顧客DCの行位置を求める Range("BC1:BE1").Value = Sheets("data").Cells(kensaku, 1).Value '整理No Range("AX1").Value = Sheets("data").Cells(kensaku, 2).Value '固有ID Range("I4").Value = Sheets("data").Cells(kensaku, 3).Value '工場名 Range("P4").Value = Sheets("data").Cells(kensaku, 4).Value '柱No Range("W4").Value = Sheets("data").Cells(kensaku, 5).Value '盤No Range("I5").Value = Sheets("data").Cells(kensaku, 6).Value '変台系統1 Range("S5").Value = Sheets("data").Cells(kensaku, 7).Value '変台系統2 Range("I6").Value = Sheets("data").Cells(kensaku, 8).Value '分電盤設置時期 Range("B8").Value = Sheets("data").Cells(kensaku, 9).Value '主な供給先 Range("B14").Value = Sheets("data").Cells(kensaku, 10).Value '特記 Range("AD4").Value = Sheets("data").Cells(kensaku, 11).Value '盤位置の目安 Range("AT8").Value = Sheets("data").Cells(kensaku, 12).Value '幹線線相 Range("R36").Value = Sheets("data").Cells(kensaku, 13).Value '盤写真ファイル名 Range("AT36").Value = Sheets("data").Cells(kensaku, 14).Value '単結図ファイル名 End Sub '■sheet 1のモジュール。"$R$36"と"$AT$36"の写真ファイル名を見て、"C37"と"AE37"セルに表示させる。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim touroku As Long Select Case Target.Address Case "$BC$1" Call hyouji Case "$R$36" myLoadPicture "board_Image", Target.Text, Range("C37") Case "$AT$36" myLoadPicture "map_Image", Target.Text, Range("AE37") Case "$AT$8" Call red_circle Case Else Exit Sub End Select End Sub Private Sub myLoadPicture(folderName As String, fname As String, targetRange As Range) Dim pict As Shape, picPath As String picPath = ThisWorkbook.Path & "\" & folderName & "\" & fname If fname = "" Then picPath = ThisWorkbook.Path & "\" & folderName & "\" & "NoImage.jpg" End If With ActiveSheet For Each pict In .Shapes If pict.TopLeftCell.Address = targetRange.Address Then pict.Delete Exit For End If Next pict Set pict = .Shapes.AddPicture(picPath, msoTrue, msoFalse, _ targetRange.Left, targetRange.Top, 300, 360) End With End Sub

  • excel VBA 2つのプロシージャを1つに

    いつもお世話になっております。 初心者ですが、苦しみながらもexcelでデータベースを作成しております。 さて Worksheet_Change のイベントが2つあり、これを一つにまとめようとしているのですが、がんばっているんですが、自分ではどうしてもうまくいかない為、投稿させていただきました。 コードは下記2つです。 また、どういったものを作ろうとしているのか説明不足でご指摘を頂戴することもありますので、試作段階のファイルですが、アップローダーにあげさせていただきました。確認頂ければ幸いです。 ■アプロダ 投稿No 4514 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■作ろうとしているデータベースの概要 inputシート・・・データを直接入力して、また、データや写真を閲覧をするシート dataシート・・・データを格納するシート、オートフィルタを使って、曖昧検索フィルタもここでかけたりします。 どうか良いお知恵を拝借させていただきたくよろしくお願いします。 '一つ目のプロシージャ(Noセルに数字が入ると、そのNoのデータを自動的にdataシートまで読みにいって表示させます) Private Sub WorkSheet_Change(ByVal Target As Range) 'No入力してデータ反映 Dim fRange As Range Dim fRow As Long If Target.row <> 4 Then Exit Sub If Target.Column <> 3 Then Exit Sub Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Range("F4").Value = Sheets("data").Cells(fRow, 2).Value Range("C5").Value = Sheets("data").Cells(fRow, 3).Value Range("C6").Value = Sheets("data").Cells(fRow, 4).Value Range("C7").Value = Sheets("data").Cells(fRow, 5).Value Range("F5").Value = Sheets("data").Cells(fRow, 6).Value End Sub '二つ目のプロシージャ(写真を表示させるためのコードです) Private Sub Worksheet_Change(ByVal Target As Range) Select Case Target.Address Case "$k$4" myLoadPicture "board_Image", Target.Text, Range("I5") Case "$K$17" myLoadPicture "map_Image", Target.Text, Range("I18") Case Else Exit Sub End Select End Sub

  • VBA で2つのプロシージャを一つにまとめたい

    いつもここにはお世話になっており、ありがとうございます。 さて、タイトルにもありました通り、下記2つのプロシージャでコマンドボタンを設定して、実行しておりますが、これを一つのプロシージャ(ボタン)にまとめたく、ご指導お願いいたします。 ○作ろうとしているVBAの概要 1)EXCELのデータベースで、一枚目の「inputシート」に入力し、2枚目の「dataシート」でデータをどんどん格納していきます。 2)データは、「顧客CDボタン」で管理しており、これをキーとしています。 3)「顧客CD」は[inputシート」ではC4セル、「dataシート」ではA列にで管理しています。 3)データは新規にデータを入力したときの登録ボタン(一つ目のプロシージャ)、既存のデータを編集して、上書きするときの、変更登録ボタン(二つ目のプロシージャ)があります。 ○相談したい内容 「登録ボタン」と「変更」ボタンを一つにまとめて、ひとつのボタンとして、新規にデータを登録するときも、変更したデータを登録するときも、同じボタンで行えるようにしたい。 '■1つ目のプロシージャー Private Sub CommandButton1_Click() '登録ボタン Dim row As Integer row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 2).Value = Range("C5").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 3).Value = Range("C6").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 4).Value = Range("C7").Value row = WorksheetFunction.CountA(Sheets("data").Columns(1)) Sheets("data").Cells(row, 5).Value = Range("F5").Value ActiveWorkbook.Save End Sub '■2つ目のプロシージャー Private Sub CommandButton3_Click() '変更ボタン Dim fRange As Range Dim fRow As Long If (Range("C4").Value = "") Then '顧客CDが入力されていない? MsgBox "顧客コードを入力してください。", vbExclamation Exit Sub End If Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 2).Value = Range("C5").Value Sheets("data").Cells(fRow, 3).Value = Range("F5").Value

  • VBAのコードを見ていただけませんか

    いつも、ここのサイトの方々には大変お世話になっております。ありがとうございます。 さてexcel2000で、dataというフォームにデータを格納し、メインのシートから、読みに行って編集するデータベースを作成しようとしています。 とあるサイトを参考にして、コードを作成しましたが、いくら頑張ってもどうしてもエラーが出てしまいうまくいきません。 どうか、コードのチェック・修正内容の提案等をいただけないでしょうか?よろしくお願いいたします。 (1)自分で登録した「IDが見つかりません」という表示しかでず、登録が出来ない (2)dataシートのB列(2列目)が主キー(IDと呼んでいます) です。(メインのシートとデータを照合させる部分) (3)メインのシートのIDはAL1~AQ1行セルまでを結合したセルに保管しています。 (4)下記コードでCommandButton1ボタンを「登録」と命名し、メインシートで入力したデータをdataシートに変更登録、新規に入力したデータも登録できるようにしたい。 (5)スピンボタンでIDを変化させて、メインフォーム上のデータも変化させたいけど、こちらも同種のエラーが出てしまう。 ■以下コードです。 Private Sub CommandButton1_Click() Dim fRange As Range Dim fRow As Long If (Range("AL1").Value = "") Then 'IDが入力されていない場合 MsgBox "IDを入力して下さい", vbExclamation Exit Sub End If Set fRange = Sheets("data").Columns(2).Find(What:=Range("AL1").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then 'IDが見つからなかった場合 MsgBox "IDが見つかりません", vbExclamation Exit Sub End If fRow = fRange.row 'IDの行位置を求める Sheets("data").Cells(fRow, 1).Value = Range("AZ1:BE1").Value Sheets("data").Cells(fRow, 2).Value = Range("AL1").Value Sheets("data").Cells(fRow, 3).Value = Range("AA1:AO1").Value Sheets("data").Cells(fRow, 4).Value = Range("D5:E5").Value Sheets("data").Cells(fRow, 5).Value = Range("G5").Value Sheets("data").Cells(fRow, 6).Value = Range("I5").Value Sheets("data").Cells(fRow, 7).Value = Range("D5:F7").Value Sheets("data").Cells(fRow, 8).Value = Range("G6:I7").Value Sheets("data").Cells(fRow, 9).Value = Range("E8:E9").Value Sheets("data").Cells(fRow, 10).Value = Range("G8:G9").Value Sheets("data").Cells(fRow, 11).Value = Range("B11:I24").Value Sheets("data").Cells(fRow, 12).Value = Range("B71").Value Sheets("data").Cells(fRow, 13).Value = Range("C71").Value Sheets("data").Cells(fRow, 14).Value = Range("B73").Value Sheets("data").Cells(fRow, 15).Value = Range("C73").Value Sheets("data").Cells(fRow, 16).Value = Range("B75").Value Sheets("data").Cells(fRow, 17).Value = Range("C75").Value   ’・・・・全部でfRow122まであります End Sub

  • エクセルVBAマクロの質問です。

    マクロ初心者です。行き詰まってます。 sheet1には300件程度のデータがあります。 このデータの3列目の値を、VLOOKUPでsheet3のA1:B30範囲から参照します。そこで取得した回数分、sheet1の各行のデータをsheet2にコピーしたいんです。 そこで、コード文を作ってみましたが、マクロがうまく動きません。 すみませんが、お知恵を貸していただけないでしょうか? Dim Z as Long Dim L As Long Dim P As Long Dim Kensaku As String Dim M4 As Range Dim PRow As Long Dim i As Long Set M4 =Sheets(“sheet3”).Range(“A1:B30“) L = Sheets(“sheet1”).Range(“A1”).End(xlup).Row For Z = 1 to L-1 Kensaku = Sheets(“sheet1”).Cells(Z+1,3).Value P=Worksheetfunction.Vlookup(Kensaku,M4,2,False)    For i = 1 to P      Prow=Sheets(“sheet2”).Range("A1").End(xlDown).Row      Sheets(“sheet1”).Rows(Z+1).Copy Sheets(“sheet2”).Rows(Prow)    Nexti Next Z

  • excel match で日付が見つからない

    ■困っていること vbaの worksheetfunction のmatach関数を用いているが、日付が見つかってくれない。 なぜ見つからないか、原因を教えていただけないでしょうか?よろしくお願いします。 ■状況、やりたいこと 下記、コードで、「fRow」と「syu」までは正しく求められるのですが、「tcol」を求めようとすると、どうしても0になってしまいます。 ワークシートはD1セルに日付を入力おり、さらに右のセルへ行く毎に+7しています。「syu」の日付がどの週に該当するのかを、列数で求めたいです。 例えば、10年3月17日なら、Fの列なので 6 を求められるようにしたいです。 sub test() Dim fRow As Long Dim tcol As Long Dim syu As long With Worksheets("data") Set fRange = Sheets("data").Columns(1).Find(What:=TextBox1.Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then Exit Sub End If fRow = fRange.Row   syu = .Cells(fRow, 2).Value tcol = Application.WorksheetFunction.Match(syu, .Range("1:1"), 1) msgbox tcol   end with end sub

  • excel2000 vba スピンボタン

    いつもお世話になっています。 下記内容の変更をしたいのですが、自分ではうまくいかず、お力をお貸しください。 よろしくお願いします。 一枚のデータシートと一枚の入力用フォームがあります。 入力フォームのスピンボタンのNOをキーにして、データシートのレコードを一件ずつ切り替えて、表示させるようにしています。 さてデータシートのオートフィルターでフィルターをかけた時に、それにあわせて、スピンボタンのNOを飛ばすようにしたいのですが、どのように修正していいか、わかりません。 現状ですと、下記プロシージャですが、いまのままだと、スピンボタンの値が一つずつしかかわりません。 'スピンボタンの値が変わったらテキストボックスに反映 Private Sub SpinButton1_Change() TextBox1.Value = SpinButton1.Value Call hyouji End Sub Private Sub hyouji() 'データを検索して表示する Dim fRange As Range Dim fRow As Long Set fRange = Sheets("data").Columns(3).Find(what:=TextBox1.Value, _ LookIn:=xlValues, lookat:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then ' MsgBox "Noがみつかりません", vbExclamation Exit Sub End If fRow = fRange.Row '検索されたNoの行位置を求める With Worksheets("data") TextBox2.Value = .Cells(fRow, 4).Value TextBox3.Value = .Cells(fRow, 5).Value TextBox4.Value = .Cells(fRow, 6).Value TextBox5.Value = .Cells(fRow, 7).Value TextBox6.Value = .Cells(fRow, 8).Value End With SpinButton1.SetFocus End Sub ※現物ファイルを下記に投稿(No5643)させていただきました。見ていただけると幸いです。 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi

  • EXCEL VBAの配列でわかりません。

    こんなコードがあるのですが、最後の他のシート(作業中シート)に書き込もうとするとエラーになってしまいます。”Sheets("作業中").”を抜くと同じシートに結果は返ってくるのですが…。コードの内容は、ある範囲のある列から空白ではないセルを探し出してその行のデータを配列で汲み取り、他のシートに一括で洗い出すというものです。 Sub 作業中() Dim myRow As Long Dim Data As Variant Dim WC() As Variant Dim WCE() As Variant myRow = Range("H1").CurrentRegion.Rows.Count Data = Range("H1:M" & myRow).Value For i = 1 To myRow If Data(i, 5) <> "" Then a = a + 1 Else b = b + 1 End If Next ReDim WC(a) ReDim WCE(b) c = 0 d = 0 For i = 1 To myRow If Data(i, 5) <> "" Then WC(c) = Range("H" & i & ":K" & i).Value c = c + 1 Else WCE(d) = Range(Cells(i, 8), Cells(i, 11)).Value d = d + 1 End If Next For i = 0 To a Range(Cells(i + 1, 15), Cells(i + 1, 18)).Value = WC(i) Next For i = 0 To b Range(Cells(i + 1, 19), Cells(i + 1, 22)).Value = WCE(i) Next e = Range(Cells(1, 15), Cells(a, 18)).Value Sheets("作業中").Range(Cells(1, 1), Cells(a, 4)).Value = e End Sub ちなみに同じシートから↓のコードを実行するとうまくいきます。 なぜ~??わからな~い??おしえてくださーい!! Sub test() Dim a As Variant a = Range("H1:K4") Sheets("作業中").Range("N1:Q4") = a End Sub

  • エクセル VBA シートの選択 

    windows XP でエクセル2000を使っています。 Sub aaa() Sheets("Sheet1").Select Dim a As String a = Cells(2, 4) Sheets(a).Select Range("A1").Select End Sub というマクロだと セルに入っている値のシート名を探してくれます。 ですが Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range) If Intersect(Target, Range("B11:b683")) Is Nothing Then Exit Sub Worksheets("Sheet1").Range("C2").Value = Target.Value Dim b As String b = Range("C2).value (←ここをcellsにしてもダメ) Sheets(b).Select Range("A1").Select End Sub これだとsheets(b)を選びません。Sheets(b).Selectのところが黄色くなります。 何処が間違えているのでしょうか。 全くの素人ですが、仕事で必要に迫られています。 わかりやすく回答・解説くれると助かります。

  • excel VBA コードの編集 アドバイス依頼

    いつもお世話になっております。 初心者ですが、苦しみながらもaccessを意識したデータベースをexcelで作成しようとしております。 さて 下記 Worksheet_シートが2つあり、それぞれのシートで IDを関連付ける主キーにしてデータを管理しています。 ■1枚目「input」シート ・・・ データを入力・閲覧するシート(accessでいうフォームにあたります)、主キーはC4セルに入力しています。 ■2枚目「data」シート ・・・ inputシートで入力・編集されたデータを保管するするシート(accessでいうとテーブルにあたります)。主キーはA列に登録されています。 ■データの閲覧方法 ・・・inputシートに、「最初へ」「前へ」「次へ」「最後へ」と4つのボタンをinputシートに設けて、主キー番号を可変させてデータを閲覧できるようにしています。また、C4セルに直接数字を入力しても、データをdataシートへ読みにいって、表示させられるようにしています。 ■困っていること、 ・・・C4セルに数字を打ち込んでデータを閲覧した後、「前へ」「次へ」ボタンを押すと、エラー(オブジェクト変数または、withブロック・・・)または、全く違う番号にジャンプしてしまいます。 ■お願いしたいこと ・・・C4セルに数字を打ち込んでデータを閲覧した後、、「前へ」「次へ」ボタンを押して、その前後のデータが確認できるようなコードに修正したいのですが、どういったコードにすればいいか教えていただけないでしょうか? コードは下記です。 また、どういったものを作ろうとしているのか説明不足でご指摘を頂戴することもありますので、試作段階のファイルですが、アップローダーにあげさせていただきました。確認頂ければ幸いです。 ■アプロダ 投稿No 4520 http://www.kent-web.com/pubc/book/test/uploader/uploader.cgi ■↓以下 関係あると思われるコード抜粋です '■レコードの移動コード(標準モジュールに記載) Public trg As Range Sub Saisyo() Set trg = Worksheets("data").Range("a1") Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki End Sub Sub Saigo() Set trg = Worksheets("data").Range("A60000").End(xlUp) Call Tenki End Sub Sub Mae() If trg.row >= 3 Then Do Set trg = trg.Offset(-1, 0) Loop Until trg.EntireRow.Hidden = False If trg.row = 1 Then MsgBox "これより前のレコードはありません" Call Saisyo Exit Sub Else Call Tenki End If Else MsgBox "これより前のレコードはありません!" End If End Sub Sub Tsugi() If trg.row < Worksheets("data").Range("A60000").End(xlUp).row Then Do Set trg = trg.Offset(1, 0) Loop Until trg.EntireRow.Hidden = False Call Tenki Else MsgBox "これより後ろのレコードはありません" End If End Sub Sub Tenki() Worksheets("input").Range("c4").Value = trg.Offset(0, 0) End Sub '■ワークシートチェンジコード(ワークシートに記載) Private Sub Worksheet_Change(ByVal Target As Range) Dim fRange As Range Dim fRow As Long Select Case Target.Address Case "$C$4" Set fRange = Sheets("data").Columns(1).Find(What:=Range("C4").Value, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows) If (fRange Is Nothing) Then '見つからなかった? MsgBox "入力された顧客コードが存在しません。", vbExclamation Exit Sub End If fRow = fRange.row '検索された顧客DCの行位置を求める Range("F4").Value = Sheets("data").Cells(fRow, 2).Value Range("C5").Value = Sheets("data").Cells(fRow, 3).Value Range("C6").Value = Sheets("data").Cells(fRow, 4).Value Range("C7").Value = Sheets("data").Cells(fRow, 5).Value Range("F5").Value = Sheets("data").Cells(fRow, 6).Value Range("k4").Value = Sheets("data").Cells(fRow, 7).Value Range("k17").Value = Sheets("data").Cells(fRow, 8).Value Case "$K$4" myLoadPicture "board_Image", Target.Text, Range("I5") Case "$K$17" myLoadPicture "map_Image", Target.Text, Range("I18") Case Else Exit Sub End Select End Sub

専門家に質問してみよう