• ベストアンサー

エクセル VBAの作成について

初心者なりに、色々参考にさせてもらいながらエクセル・VBAで、 顧客データと業者コードに入力した数字や文字列を 顧客Noを入力すると請求書に表示される、というVBAを作ったのですが、顧客データの並び順が表に反映されてしまいます、 (例えば顧客NoがNo5だと請求書10行目から順に表示したいのに、13行目に表示されてしまいます。No4だと12行目、No3だと11行目という風に・・) ws1の、顧客データは、10行目から順に1行ずつ下がって入力したいけど、 ws2の、業者コードの情報は3行目のまま固定して表示したいのです。 こんな場合どうすればいいでしょうか・・? 説明足りなければ申し訳ありません。。 下に、自分で作ったVBA張っておきます。↓   Sub 請求書作成() Dim getstr As String Dim msg As String Dim title As String Dim irange As Integer Dim iirange As Integer  Set ws1 = Worksheets("顧客データ")  Set ws2 = Worksheets("業者コード")  Set ws6 = Worksheets("▲請求書▲") msg = "顧客NO.を入力してください" title = "NO.入力" getstr = InputBox(msg, title) getstr = UCase(getstr)   irange = Int(getstr) + 4   iirange = Int(getstr) + 8  ws6.Range("a4") = ws1.Range("g" & irange)  ws6.Range("d3") = ws1.Range("j" & irange) EndRow = Cells(ws6.Rows.Count, 8).End(xlUp).Row  ws6.Range("c" & iirange) = ws1.Range("l" & irange)  ws6.Range("f" & iirange) = ws1.Range("c" & irange)  ws6.Range("n" & iirange) = ws1.Range("bf" & irange)  ws6.Range("v" & iirange) = ws1.Range("dh" & irange)  ws6.Range("ab" & iirange) = ws1.Range("ac" & irange)  ws6.Range("aw" & iirange) = ws1.Range("dz" & irange)  ws6.Range("ah" & iirange) = ws2.Range("l" & irange + 2) End sub

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

  • ベストアンサー
  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.8

たびたび、ごめんなさい。 さっきとほとんど同じですが、 If EndRow < 10 Then EndRow = 9 に直してなかったので、修正します。 Sub 請求書作成()  Dim getstr As String  Dim getval As Double  Dim msg As String  Dim title As String  Dim irange As Integer  Dim ws1 As Worksheet  Dim ws2 As Worksheet  Dim ws6 As Worksheet  Dim EndRow As Long  Set ws1 = Worksheets("顧客データ")  Set ws2 = Worksheets("業者コード")  Set ws6 = Worksheets("▲請求書▲")  msg = "顧客NO.を入力してください"  title = "NO.入力"  getstr = InputBox(msg, title)  If getstr = "" Then Exit Sub  getval = Val(getstr)  If IsNumeric(getval) = False Then GoTo Err  If getval <= 0 Then GoTo Err  If Int(getval) <> getval Then GoTo Err  irange = getval + 4  EndRow = ws6.Range("C65536").End(xlUp).Row  If EndRow < 10 Then EndRow = 9  ws6.Range("A4") = ws1.Range("G" & irange)  ws6.Range("D3") = ws1.Range("J" & irange)  ws6.Range("C" & EndRow + 1) = ws1.Range("L" & irange)  ws6.Range("F" & EndRow + 1) = ws1.Range("C" & irange)  ws6.Range("n" & EndRow + 1) = ws1.Range("bf" & irange)  ws6.Range("v" & EndRow + 1) = ws1.Range("dh" & irange)  ws6.Range("ab" & EndRow + 1) = ws1.Range("ac" & irange)  ws6.Range("aw" & EndRow + 1) = ws1.Range("dz" & irange)  Exit Sub Err:  MsgBox "顧客Noを入力してください" End Sub

kinoyasuko
質問者

補足

たびたびご回答いただきありがとうございます。 順番に表示されてはいるのですが、 なぜか、度々51行目に表示されます。

その他の回答 (8)

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.9

#4です。 C50に空白は入っていませんか? 入っていないなら、 ▲請求書▲シートを新規に作り直してもダメですか? それでもダメなら、 他のマクロが動いてないでしょうか?

kinoyasuko
質問者

お礼

Sub 請求書作成2() Dim getstr As String Dim getval As Double Dim msg As String Dim title As String Dim irange As Integer Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws6 As Worksheet Dim EndRow As Long Set ws1 = Worksheets("顧客データ") Set ws6 = Worksheets("請求書") msg = "顧客NO.を入力してください" title = "NO.入力" getstr = InputBox(msg, title) If getstr = "" Then Exit Sub getval = Val(getstr) If IsNumeric(getval) = False Then GoTo Err If getval <= 0 Then GoTo Err If Int(getval) <> getval Then GoTo Err irange = getval + 4  EndRow = ws6.Range("C43").End(xlUp).Row If EndRow < 10 Then EndRow = 9 ws6.Range("A4") = ws1.Range("G" & irange) ws6.Range("D3") = ws1.Range("J" & irange) ws6.Range("C" & EndRow + 1) = ws1.Range("L" & irange) ws6.Range("F" & EndRow + 1) = ws1.Range("C" & irange) ws6.Range("n" & EndRow + 1) = ws1.Range("bf" & irange) ws6.Range("v" & EndRow + 1) = ws1.Range("dh" & irange) ws6.Range("ab" & EndRow + 1) = ws1.Range("ac" & irange) ws6.Range("aw" & EndRow + 1) = ws1.Range("dz" & irange) Exit Sub Err: MsgBox "顧客Noを入力してください" End sub で、やってみたらいけました!!! 質問が分かりにくいにもかかわらず、ご回答頂きありがとうございました。 ほんとうに助かりました!

kinoyasuko
質問者

補足

遅くなってしまい申し訳ありません。 C50でなくC51だったのですが、C51の空白を埋めてみても、C52に表示されます。 以下C52から順に埋めていってもその下にずれて表示されます、、 違うシートに作ってみましたが、これもまた同じ結果になりました。 別のマクロは動かしていないし動いていないです。 もう少し検証してみます。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.7

#4です。 すみません。 場当たり的に訂正したせいで、余計なエラーが でたようです。 再度修正したので試してください。 尚、50行目から出力されたとのことですが、 おそらく、もとのシートのC49に何か入力されていた 可能性があります。(空白など) 結果を教えてください。 Sub 請求書作成()  Dim getstr As String  Dim getval As Double  Dim msg As String  Dim title As String  Dim irange As Integer  Dim ws1 As Worksheet  Dim ws2 As Worksheet  Dim ws6 As Worksheet  Dim EndRow As Long  Set ws1 = Worksheets("顧客データ")  Set ws2 = Worksheets("業者コード")  Set ws6 = Worksheets("▲請求書▲")  msg = "顧客NO.を入力してください"  title = "NO.入力"  getstr = InputBox(msg, title)  If getstr = "" Then Exit Sub  getval = Val(getstr)  If IsNumeric(getval) = False Then GoTo Err  If getval <= 0 Then GoTo Err  ws1.Range("A1").Value = getval  ws1.Range("B1").Value = Int(getval)  If Int(getval) <> getval Then GoTo Err  irange = getval + 4  EndRow = ws6.Range("C65536").End(xlUp).Row  If EndRow < 10 Then EndRow = 10  ws6.Range("A4") = ws1.Range("G" & irange)  ws6.Range("D3") = ws1.Range("J" & irange)  ws6.Range("C" & EndRow + 1) = ws1.Range("L" & irange)  ws6.Range("F" & EndRow + 1) = ws1.Range("C" & irange)  ws6.Range("n" & EndRow + 1) = ws1.Range("bf" & irange)  ws6.Range("v" & EndRow + 1) = ws1.Range("dh" & irange)  ws6.Range("ab" & EndRow + 1) = ws1.Range("ac" & irange)  ws6.Range("aw" & EndRow + 1) = ws1.Range("dz" & irange)  Exit Sub Err:  MsgBox "顧客Noを入力してください" End Sub

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.6

#4です。 ごめんなさい。 またまた間違ってました。 誤: Dim getstr As String 正: Dim getstr As Long

kinoyasuko
質問者

補足

こちらこそ、 さっきの元の方のVBAですが、 入力されないのではなく、下ーの方(50行目)に表示されていました! しかも順番に表示されていましたので、 これが10行目にくると成功なのですが・・・! やってみようとしましたが分かりませんでした。 正してみました。 のですが今度は、 If getstr = "" Then Exit Sub が黄色くなりエラーが起きました。

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.5

#4です。 間違えました。 誤: If EndRow < 10 Then EndRow = 10 正: If EndRow < 10 Then EndRow = 9

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.4

サンプルを作ってみました。 意図している通りであれば幸いです。 おせっかいな指摘ですが、この方法では、 顧客データが確実に連番で入力されていないといけませんね。 顧客Noが5のデータは絶対に5+4=9行目になければ なりません。 これで実害が無ければ良いのですが、顧客Noを検索して、 ヒットした行を出力した方が確実だと思いますよ。 Sub 請求書作成()  Dim getstr As String  Dim msg As String  Dim title As String  Dim irange As Integer  Dim ws1 As Worksheet  Dim ws2 As Worksheet  Dim ws6 As Worksheet  Dim EndRow As Long  Set ws1 = Worksheets("顧客データ")  Set ws2 = Worksheets("業者コード")  Set ws6 = Worksheets("▲請求書▲")  msg = "顧客NO.を入力してください"  title = "NO.入力"  getstr = InputBox(msg, title)  If getstr = "" Then Exit Sub  If IsNumeric(getstr) = False Then GoTo Err  If getstr <= 0 Then GoTo Err  If Int(getstr) <> getstr Then GoTo Err  irange = getstr + 4  EndRow = ws6.Range("C65536").End(xlUp).Row  If EndRow < 10 Then EndRow = 10  ws6.Range("A4") = ws1.Range("G" & irange)  ws6.Range("D3") = ws1.Range("J" & irange)  ws6.Range("C" & EndRow + 1) = ws1.Range("L" & irange)  ws6.Range("F" & EndRow + 1) = ws1.Range("C" & irange)  ws6.Range("n" & EndRow + 1) = ws1.Range("bf" & irange)  ws6.Range("v" & EndRow + 1) = ws1.Range("dh" & irange)  ws6.Range("ab" & EndRow + 1) = ws1.Range("ac" & irange)  ws6.Range("aw" & EndRow + 1) = ws1.Range("dz" & irange)  Exit Sub Err:  MsgBox "番号を入力してください" End Sub

kinoyasuko
質問者

補足

ご回答ありがとうございます! 上記のVBAで実行してみたのですが、 A4とD3のセルにしか表示されませんでした。。 やはり違うシートのバラバラの情報を持ってきて並べるというのは難しいことなのでしょうか? EndRow = ws6.Range("C65536").End(xlUp).Row If EndRow < 10 Then EndRow = 10 という部分やEndRowが、良く分かっていないので応用してみたりうまく対処できないです。。 すいません。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

ANo.2 です。 >"顧客データ"(ws1)のシートは、 >B5セルから表がはじまり、 >行ごとに各顧客のデータが並んでいます。 >たとえば「1」と入力するとコード「1」の顧客のデータの行から、必要な各列のデータを、 >"請求書"(ws6)シートのA4・D3セルと、 >C10・F10・N10・V10・AB10・AH10・AW10セルに まずここでは、顧客Noを入力(InputBox)すると、該当する行に変換(顧客No+データ開始行)して、請求書(WS6)の各セルに 表示する。 ↑の事と、 >10行目の各列から入力し始め、一行ずつ行数を増やして入力。 の関係がよくわからないのですが。 1行ずつ行数を増やして入力、と言っても、WS6は顧客データより呼び出したものが表示されており、 そこへ別のデータを入力している?と言う事でしょうか? 或いは一旦出来上がった請求書データを顧客データに追加していきたいと、 言う事ですか? それならば、行を増やしていきたいと言うのは理解できますが、 同一の顧客Noが顧客データに発生してしまいます。 ”請求書に表示する”と”一行ずつ行数を増やして入力”の関係を明確に お願いします。

kinoyasuko
質問者

補足

迅速な返信ありがとうございます。 えっと、 メッセージボックスに顧客Noを入力すると、 請求書(ws6)の各セルに顧客Noの情報が表示されるようにしたい。 というのが目的です。 請求書(ws6)のセルには何も表示されておりません。 10行目云々というのは、上の作業を行う際に 一つの顧客のデータを、請求書(ws6)のC10から一行ずつ表示していくのですが、 顧客ごとに順に行数を増やしていきたいということです。 ひとつの請求書に、幾つも顧客のデータが入ります。 質問のところで書いているVBAを実行してみると、 請求書(ws6)の各セルに表示までは出来たのですが、行がバラバラでそれが出来なかったのです。 これで説明できてますかね・・? 分かりにくければごめんなさい。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

各シート構成とやりたい事(箇条書きでも)を提示された方が、 いいと思いますよ。 コードが正しいかどうかは、検証できる質問者さんにしか わかりませんから。

kinoyasuko
質問者

補足

なるほど、ありがとうございます。 分かりにくいかもですが、文章にまとめてみます。 "顧客データ"(ws1)のシートは、 B5セルから表がはじまり、 行ごとに各顧客のデータが並んでいます。 たとえば「1」と入力するとコード「1」の顧客のデータの行から、必要な各列のデータを、 "請求書"(ws6)シートのA4・D3セルと、 C10・F10・N10・V10・AB10・AH10・AW10セルに に入力され、 10行目の各列から入力し始め、一行ずつ行数を増やして入力。 という作業をしたいのです。 (すいません、"業者コード"(ws2)の表記は必要なかったです。。) それで、上記のVBAを作成したのですが いざ実行してみると、顧客データの行数に比例して"請求書"(ws6)に入力されてしまいます。 一行ずつ行を下げて、これらの情報を入力するにはどうすれば良いのでしょうか?

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

模擬実例式に質問に挙げえられないのですかね。 ごたごたした印象で質問が頭にすっと入らない。 ーー 顧客番号指定下として、他(や同一)のシートを「検索」して、顧客番号がヒットした行の他列データ(会社名などデータを)引くものだが、それはどこでやってますか。 ーー 普通顧客番号が入力されれば、社名は顧客データシートから引いて 請求書にセット。その場合VLOOKUP関数などが、短くて最適。 その場合も一々INPUTBOXで聞くのではなく、請求書発行先の顧客番号の入ったシートなりを用意し、行を変えて繰り返し、請求書を印刷 するのが便利です。再発行など、臨時個別発行などなら、個別に1件 顧客番号指定に応じた処理が必要なのはわかるが。 ーー irange = Int(getstr) + 4   iirange = Int(getstr) + 8 は何をやっているのですか。Stringに対してINT(関数?)とは。 チェックしているのですか。むしろVAL()なら判るが。 ーー 業者コードの項目はどんなもの? 顧客データと分かれている様子は? 業者コードのデータは請求書へ何を引いてくるとき使うのですか。 ーー 回答者に我流のコードを長々と解読させるのでなく、何がやりたいか、文章で書いて、スマート?なコードを勉強したらどうです。 ーー ws6.Range("f" & iirange) = ws1.Range("c" & irange)  ws6.Range("n" & iirange) = ws1.Range("bf" & irange)  ws6.Range("v" & iirange) = ws1.Range("dh" & irange)  ws6.Range("ab" & iirange) = ws1.Range("ac" & irange)  ws6.Range("aw" & iirange) = ws1.Range("dz" & irange) は列が違うだけで、質問での不都合と関係ないと思いませんか。 であれば質問には省略してださず、簡潔にするとか工夫しては。

kinoyasuko
質問者

補足

分かりにくくてすみません。 >顧客番号指定下として、他(や同一)のシートを「検索」して、顧客番号がヒットした行の他列データ(会社名などデータを)引くものだ が、それはどこでやってますか。 すみません、分かりません。データは、顧客のシートから請求書のシートへ最後の式で引いてます。  irange = Int(getstr) + 4  iirange = Int(getstr) + 8 は、前に質問で教えて頂いた、入力する行の設定です。この場合iangeは4行目、iirangeは8行目から入力という設定らしいです。 業者コードは業者名です。 Sub 請求書作成() Dim getstr As String Dim msg As String Dim title As String Dim irange As Integer Dim iirange As Integer       '変数の設定です  Set ws1 = Worksheets("顧客")  Set ws2 = Worksheets("業者")  Set ws6 = Worksheets("請求書")  'ワークシートの設定です msg = "顧客NO.を入力してください"   title = "NO.入力"         'メッセージBOXの表示          getstr = InputBox(msg, title) getstr = UCase(getstr)   irange = Int(getstr) + 4   iirange = Int(getstr) + 8    'irangeの抽出・iirangeの入力の行数設定です    ws6.Range("a4") = ws1.Range("g" & irange)  ws6.Range("d3") = ws1.Range("j" & irange)  'こちらは入力する場所が常に一定なので、固定したセルを設定しています EndRow = Cells(ws6.Rows.Count, 8).End(xlUp).Row  '一行ずつ下がって入力する設定です  ws6.Range("f" & iirange) = ws1.Range("c" & irange)  ws6.Range("n" & iirange) = ws1.Range("bf" & irange)  ws6.Range("v" & iirange) = ws1.Range("dh" & irange)  'これらは、ws1から引くデータもws6に入力するセルも一行ずつ下がって入力したいので、前の式に対応させるよう最後に持ってきました。 End sub 分かりやすくなったでしょうか? このような式で処理してみると、どうも EndRow = Cells(ws6.Rows.Count, 8).End(xlUp).Row  の式が有効になっていない様なのです。 分かりにくくてすみません、私自身がギリギリで理解しています。。 よろしくお願いします。

関連するQ&A

  • VBAで変数が使いこなせなくて、困っています

    エクセル VBAで、 「業者コードを入力すると、業者の名前と電話番号を表示してくれる。」 というVBAを、本を見ながら作ったのですが、(下にコピペしました↓) これだと業者コードが増える度、VBAに入力していかなければならないことに。 業者さんはどんどん増えていくので、追いつかなく困っています。 iを使ったり応用しようとしましたが、自力ではどうも無理なのです。 初めてなので、説明不足でしたらすみません。 どうかお願いします! ------------------------------------------------------------ Sub 業者コードから入力() ' Dim getstr As String Dim msg As String Dim title As String Set ws1 = Worksheets("データ") Set ws2 = Worksheets("業者コード") Set ws3 = Worksheets("通知書") msg = "業者コードを入力してください" title = "コード入力" getstr = InputBox(msg, title) getstr = UCase(getstr) Select Case getstr Case "00" ws3.Range("d6") = ws2.Range("e7") ws3.Range("d9") = ws2.Range("i7") ws3.Range("q9") = ws2.Range("j7") Case "01" ws3.Range("d6") = ws2.Range("e8") ws3.Range("d9") = ws2.Range("i8") ws3.Range("q9") = ws2.Range("j8") Case "02" ws3.Range("d6") = ws2.Range("e9") ws3.Range("d9") = ws2.Range("i9") ws3.Range("q9") = ws2.Range("j9") Case "03" ws3.Range("d6") = ws2.Range("e10") ws3.Range("d9") = ws2.Range("i10") ws3.Range("q9") = ws2.Range("j10") Case "04" ws3.Range("d6") = ws2.Range("e11") ws3.Range("d9") = ws2.Range("i11") ws3.Range("q9") = ws2.Range("j11") Case "05" ws3.Range("d6") = ws2.Range("e12") ws3.Range("d9") = ws2.Range("i12") ws3.Range("q9") = ws2.Range("j12")   Case Else     MsgBox "エラーです" End Select End Sub ------------------------------------------------------------

  • ExcelのVBAについてです。シート1と2を作成

    ExcelのVBAについてです。シート1と2を作成し、シート1にバーコードまたはキーボードで入力します。シート1は入力専用かつ入力した分の早見表で、実際にはシート2に転記仕訳して、シート3以降に表を作成したいです。使い方はシート1に入力またはシート2をタップまたはクリックすると入力(画面)になります。以前の質問の回答を参考に必要最低限に改良しています。パッと見で構いません、何か不具合は見付からないでしょうか? '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Dim st1, s, i3 As Long Dim Bst As Range Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 st1 = ws1.Cells(Rows.Count, "E").End(xlUp).Row 'A列の最終行を設定する s = 3 For i3 = 3 To st1 Set Bst = ws2.Columns("E").Find(What:=ws1.Cells(i3, "E"), LookIn:=xlFormulas, _ LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) シート間のE列を比較 If Bst Is Nothing Then '比較して無い場合は、下記を実行 ws1.Cells(s, "A") = ws1.Cells(i3, "A") '追加する文字を転記する。(コード) s = s + 1 End If Next i3 Next i '(1)シートを変数にセット Dim ws1_ As Worksheet Set ws1_ = Worksheets("Sheet1") ws1_.Activate End Sub

  • エクセルマクロで教えてください

    Sub smp05_14_01() Dim 対象セル As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Dim 行 As Long, 列 As Long Dim i As Long Set ws1 = Worksheets("顧客") Set ws2 = Worksheets("売上") Set ws3 = Worksheets("顧客未登録") 行 = ws1.Range("A1").End(xlDown).Row - 1 列 = ws1.Range("A1").End(xlToRight).Column Set 対象セル = ws1.Cells(1, 列 + 2).Resize(2, 行) For i = 1 To 行 対象セル(1, i).Value = "顧客NO" 対象セル(2, i).Value = "<>" & ws1.Cells(i + 1, 1) Next ws2.Range("A1").CurrentRegion.AdvancedFilter _ Action:=xlFilterCopy, _ CriteriaRange:=対象セル, _ CopyToRange:=ws3.Range("A1") 対象セル.Clear End Sub 上記のマクロは売上のシートに登録されている以外の顧客NOを顧客シートを参照して顧客未登録シートにコピーするのもですが添付したファイルの数だと上手くいくのですが、エクセルのヨコのセルの最大値の258を越えると上手くいきません。上記の処理で1000レコードを越えても売上シートに登録されている以外の顧客NOを参照して顧客未登録シートにコピーするマクロを教えてください。

  • ExcelのVBAについて(勉強中のです。)

    ExcelのVBAについて(勉強中のです。) ここからコード3以降に入力したコードを抜き出してデータ表を作成しそれを保存するコードを作成したいです。例えばCSV形式にするとか? データ表は1日分の表示で、保存して週間や月間または統計データまでを視野にいれています。今回は保存する所です。。 利用しやすい状態と保存形式で、よろしくお願いします。データは生活記録みたいなものです。何したどうしたどうなった? ※大分分岐する予定で、作成中であり、今回はコードの整理は不要です。 '///Sheet1/// Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim time7 As Range For Each time7 In Target If time7.Column = 1 Then time7.Offset(0, 4).Value = Format(Now, "Short Time") & vbCrLf & _ Format(Now, "yyyy/mm/dd hh:nn:ss AM/PM") End If Application.EnableEvents = False Application.EnableEvents = True Next time7 '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") '(2)シートを指定してデータを転記 ws2.Range("A3:H3").Value = ws1.Range("A3:H3 ").Value End Sub Private Sub Worksheet_Activate() ' ' 新規行挿入 ' ' Worksheets("Sheet2").Range("3:3").Insert Sheets("Sheet1").Range("H3").Select ActiveCell.FormulaR1C1 = "5" Sheets("Sheet1").Range("E3").Select Selection.ClearContents Dim str_Left As String 'セルE4に文字列、セルH4に数字を予め入れておくこと。 str_Left = Left(Cells(4, 5), Cells(4, 8)) MsgBox str_Left & vbCrLf & " " & "OKボタンを押してください!" Sheets("Sheet1").Range("A3").Select Dim se_r As String se_r = Application.InputBox("バーコードを入力してください") Select Case se_r Case "False" MsgBox "キャンセルされました" Case "" MsgBox "空欄が入力されました" Case Else Range("A3").Value = se_r End Select End Sub ' ///Sheet2/// Private Sub Worksheet_Activate() Dim Emp(1 To 300) As String Dim msg As String Dim i, i2, Cnt As Integer Dim N_In As Variant For i = 3 To 3 If IsEmpty(Cells(i, 1).Value) = False Then 'ここで空欄判定 Worksheets("Sheet1").Range("3:3").Insert '対象セルアドレスを改行処理 End If Next i '(1)シートを変数にセット Dim ws1 As Worksheet Dim ws2 As Worksheet Set ws1 = Worksheets("Sheet1") Set ws2 = Worksheets("Sheet2") ws1.Activate End Sub

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • エクセル VBA

    VBA内で、そのVBAの実行を制御することは可能でしょうか? 下のようなコードを作ったのですが、 Sub 承認書作成() Dim ws0 As Worksheet, ws1 As Worksheet, r1 As Range Dim i As Long Dim nyuryoku(), chikuseki() Set ws0 = Worksheets("承認書作成") Set ws1 = Worksheets("顧客データ") Set ws2 = Worksheets("業者コード") Set ws3 = Worksheets("承認通知書") Worksheets("顧客データ").Select Range("テーブル1[[#Headers],[NO.]]").Select Selection.End(xlToRight).Select Selection.End(xlDown).Select Selection.ListObject.ListRows.Add AlwaysInsert:=False Range("B7").Select nyuryoku = Array("b5", "d5", "f5", "h5", "j5", "l5", "n5", "p5", "b6", "d6", "f6", "h6", "j6", "l6", "n6", "p6", "b4", "d4") '転記したいセルの位置 chikuseki = Array("0", "1", "5", "6", "8", "9", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "53", "54") '転記先の列のオフセット値  Set r1 = ws1.Range("f" & Rows.Count).End(xlUp).Offset(0) 'データ蓄積セル  For i = 0 To UBound(nyuryoku) r1.Offset(0, chikuseki(i)).Value = ws0.Range(nyuryokui)).Value '入力 Next MsgBox "入力完了" Dim lRowNum As Long '転記先となる行番号を求める lRowNum = ws1.Cells(Rows.Count, "b").End(xlUp).Row '転記 ws3.Cells(6, "d").Value = ws1.Cells(lRowNum, "j").Value ws3.Cells(17, "g").Value = ws1.Cells(lRowNum, "c").Value ws3.Cells(22, "g").Value = ws1.Cells(lRowNum, "l").Value ws3.Cells(22, "ac").Value = ws1.Cells(lRowNum, "ab").Value    Set ws0 = Nothing   Set ws1 = Nothing End Sub ここに、     If call Macro1 then call 承認書作成  '上のマクロです    Else: Msgbox"中止" 「Macro1を実行しないと承認書作成マクロを実行できない」 という コードを組み込みたいのですが、うまくいきません。 VBA内に同じVBAを組み込むことは不可能なのでしょうか?

  • エクセル VBA データ入力

    こんにちは、はじめまして。 エクセル・VBA初心者です。 会社に入って3ヶ月になります。 同じファイル内で、入力用シートから 違うシートに表としてデータを転送するため、 本や今まで作ったものを参考にして下のようなVBAを作成したのですがうまくいきません。 Sub 転記() Dim ws0 As Worksheet, ws1 As Worksheet, chikuseki As Range Dim nyuryoku() Set ws0 = Worksheets("Worksheet1") Set ws1 = Worksheets("Worksheet2") nyuryoku = Array("b3", "d3", "f3", "h3") '転記したいセルの位置 Set chikuseki = ws1.Range("f", "g", "k", "q" & Rows.Count).End(xlUp).Offset(1) 'データ蓄積セル For i = 0 To UBound(nyuryoku) chikuseki.Offset(0, i).Value = ws0.Range(nyuryoku(i)).Value ws0.Range(nyuryoku(i)).MergeArea.ClearContents Next masgbox "入力完了" End Sub 十何個あるデータを転送する場合、フォームから入力した方が簡単なのでしょうか? また、表にデータを転記し、そのなかのデータのいくつかを別の表に転記することは、一度の操作で可能ですか? 今週中に仕上げろと言われたので急いでいます、 どうかよろしくお願いします。 質問がまとまっていなくてわかりにくければ申し訳ないです。

  • ExcelのVBAについて

    こんにちは、VBA初心者です。 C:\pictureの中に以下のファイルがあります。 DSC_0134.JPG~DSC_0154.JPG これらのファイルをExcelのA列1~20行に書かれた文字△○%&◎~▲▽%%★に.JPGをつけて保存したくて以下のコードを書きました。 Dim buf As String Dim msg As String Dim i As Integer Dim A As Variant i = 1 buf = Dir("dsc*.jpg", vbNormal) Do While buf <> "" Do While i < 21 buf = Dir() msg = buf 'msg=元の名前 A = Worksheets("sheet1").Cells(i, 1).Value     Worksheets("sheet1").Cells(i, 2).Value = msg          Name "C:\picture\msg" As "C:\picture\A.jpg"     i = i + 1 Loop Loop Name "C:\picture\msg" As "C:\picture\A.jpg"のところで、「ファイルがありません。」となってしまいます。 あと、Worksheets("sheet1").Cells(i, 2).Value = msgのところで、\pictureの中の最初のファイル(DSC_0134.JPG)を表示しません。 どこを直せばよいのでしょうか?

  • VBA 請求書の自動印刷について

    VBAで請求書の連続印刷について質問です。 Sheet("基本情報")のA列に請求書No. B列に請求日が記載されております。 ComboBoxで入力されている請求日を選択することで、該当の全データを請求書フォーマットに転記して、全て印刷するマクロを組んでみたのですがうまくいきません。 流れとしては以下の通りです。 1、ComboBoxで請求日を選択(20日) 2、Sheet("基本情報")から、請求日が20日に該当するデータをSheet("請求書")に転記 3、Sheet("基本情報")の請求日が20日でA列の請求書Noと一致する、Sheet("詳細")の該当データを Sheet("請求書")に転記 4、印刷したら、入力データをクリアしてから、次の該当データを転記 Loop と、したいのですが、1~入力データのクリアまでは問題なく作動するのですが、次の該当データに移行しません。 MsgBoxでAddressの表示を行ったところ、たまに関係ないセルのアドレスの表示も確認でき、全くわからなくなってしまいました。 何卒、御教授の程お願い致します。 また、作成中のため、記述の整理は出来ておりませんが、併せて御教示頂ければ幸いです。 Private Sub CommandButton1_Click() Dim Ws As Worksheet, ws2 As Worksheet, pSht As Worksheet Dim StrFind As String, Res As String, _ firstAddress As String, buf As String Dim rg As Range, rg1 As Range Dim 選択行 As Integer, 選択行1 As Integer Dim i As Long, A As Long, MinRow As Long buf = Year(Date) & "/" & Month(Date) & "/" StrFind = ComboBox1.Value Set Ws = Worksheets("請求書") Set ws2 = Worksheets("詳細") Set pSht = Worksheets("基本情報") If StrFind = "" Then MsgBox "送付日を指定してください。" Exit Sub End If With pSht Set rg = .Columns(2).Find(What:=StrFind, LookAt:=xlWhole) 選択行 = rg.Row Set rg1 = ws2.Columns(1).Find(What:=.Cells(選択行, 1)) 選択行1 = rg1.Row If Not rg Is Nothing Then firstAddress = rg.Address Do DoEvents '~~~~~ここに転記の構文 およそ200行前後~~~~~ Set rg = .Columns(2).FindNext(rg) If rg Is Nothing Then Exit Do Loop Until rg.Address = firstAddress Unload Me End If End With End Sub

  • ExcelのVBAについての質問です。

    ExcelのVBAについての質問です。 計測機器をつないでsheet1に数値が書き込まれていってる状況です。下記のプログラムを特定の時間内に複数回ループされるように設定したいのですが、そのようなプログラムを加えればいいのでしょうか? Sub Macro1() ' ' Macro1 Macro ' ' Dim iRows As Integer Dim sRows As String ' 最終行の調査: iRows = Worksheets("Sheet1").UsedRange.Rows.Count ' 最終行をシート3にコピー Worksheets("Sheet1").Rows(iRows).Copy Destination:=Worksheets("Sheet3").Range("1:1") ' CH1 の最新データをシート3にコピー Worksheets("Sheet3").Range("B4").Value = Worksheets("Sheet1").Cells(iRows, 3).Value ' CH2 の最新データをシート3にコピー Worksheets("Sheet3").Range("B5").Value = Worksheets("Sheet1").Cells(iRows, 4).Value End Sub

専門家に質問してみよう