• 締切済み

前月の最終セルの値を次月のE3とG3セルに入れる

よろしくお願いします。 下記の構文で実施したのですが、次月に繰越できません。 ご教示をお願いします。 Dim U As Long Worksheets("1月").Range("E3,G3").Value = 入力フォーム.繰越.Value For U = 2 To 12 Worksheets(U & "月").Range("E3,G3").Value = Worksheets(U - 1 & "月").Range("G200").End(xlUp).Value Next U

  • 1211M
  • お礼率54% (90/165)

みんなの回答

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

質問の内容やデータの状態について、補足のこと。 そのシートのデータ行に、翌月以降のデータ行は続いてないのが? データ状況の説明が足りないよ。 (想像ーー>年内12か月の日付のデータがあるシートに混在してあって、月末(営業日?)の最終?データだけを取り出したいということか。 最終行セルは当月末日付のデータらしいが、その日付で複数行のデータはないのか。 最終行セルの日付は月末日以外(以前日とか)の場合はあるのか。(小生の上記仮定ではあるよね) VBAという、まがりながらもプログラムを使おうとしているとしては、質問表現が粗雑だ。しっかり補足のこと。 データは日付シリアル値で入っているのか。一般には日付文字列とかもあり得る。 End(xlUp)を使うにしても、有効に使える場合は限定条件がある。そういう意識は持っているか。 ーー このコードでどういうことをしたいのか、文章で表現して質問すること。 一般に、忙しい読者にコードを読み解かせるな。 VBAの質問らしいが、質問標題にVBA(マクロ)を入れること。 OKWAVEではメールの到着は質問表題しか表示されないのだ。 >次月に繰越できません。 という事態は正しく値が取れないとか、エラーになるとか? >構文で実施したのですが こういうのは実施とは言わないのでは。 実行する、処理する、データを求めるとか、の表現はどうですか。

1211M
質問者

お礼

imogasi 様 早速のご回答ありがとうございます。

  • chie65535
  • ベストアンサー率43% (8520/19369)
回答No.2

>次月に繰越できません。 どのように「できない」のか説明して下さい。 例えば「毎月のシートのシート名が『○○』になっていて、各月のシートの○○のセルに××が入っていて、それを△△に転記したい」と、具体的に説明して下さい。 で、提示されたプログラムを見る限り、 1月のシートのE3とG3に、入力フォームの「繰越」から持って来た値を入れる 2月のシートのE3とG3に、1月のシートのG列の最下行の値を入れる 3月のシートのE3とG3に、2月のシートのG列の最下行の値を入れる (中略) 12月のシートのE3とG3に、11月のシートのG列の最下行の値を入れる と言う事をやっているようですが、それで合っていますか? 合っているなら「各シートのG4以降の値は、自分自身のシートのG3の値が変わると、自動的に再計算されるようになっていなければならない筈」です。 そうなって居ないなら「最初からシートの構造が破綻している」と思われます。 つまり「現状のままでは、どうやっても、繰越プログラムは作れない」です。 何とかするには「破綻している部分を修正」しなければなりません。つまり「破綻を招かないよう、シートを最初から全部作りなおしする必要がある」でしょう。 ですので「繰越処理はこうする予定だから、シートをこういう構造で作らないとならない」と、きちんと設計し直して下さい。 なお、普通の「繰越処理」と言うのは、 ・「前月シート」と「当月シート」がある状態で ・「当月シート」の内容を「前月シート」に転記して ・「当月シート」の内容を、クリアして「月初め」の状態にする と言う処理の事を言います。 質問者さんのように「1月~12月のシートが12枚ある」と言う状況では「繰越処理そのものが不要」です。 年初に、1月~12月のデータをクリアして、1月は1月のシートを埋めて行き、2月は2月のシートを埋めていく。12月が埋まったら、ブックを「20xx年.xlsx」などにリネームして、20xx年版のデータとして保存、と言う業務になる筈です。 この業務内容なら「繰越処理」と言うのは「年始の最初の日だけ、前年の最終月の最終行の値を、当年の1月の先頭行に入れる」だけです。 現状では「前年の最終月の最終行の値」は「入力フォームの『繰越』入力ボックスに入れさせている」ので「入力ボックスで入れた値を、1月の先頭行に入れる」と言う処理を、年始に1回だけやれば良い筈です。 そういう訳で「基本的な部分で大間違いを行なっている」と思います。 そもそも「繰越処理など不要な筈」です。

1211M
質問者

お礼

chie65535 様 早速のご回答ありがとうございます。

1211M
質問者

補足

chie65535 様 早速のご回答ありがとうございます。  1.1月から12月までシート(出納帳)が12枚あります。  2.ユーザーフォームからコマンドボタン(新年)を押下して、昨年のデーターをすべて削除(空白)する  3.テキストボックス(新年の年号)に年号を入力する  4.テキストボックス(前年繰越)に繰越金額を入力する  5.シート(1月)のE3およびG3のセルに前年の繰越金額を入力する さらに同じユーザーフォーム内で月リストから月を選択  1.日にちのリストボックス  2.マルチページで、支出と入金の項目を分けています  3.その選択した項目に、リンクする詳細リスト(リストボックス)  4.支出と入金別に金額を入力するテキストボックス(2つ)  5.そして入力した支出と入金の金額を選択月のシートに入力  6.その都度、残高計算(G列)をする  7.残高計算(G列)の最終セルの金額をアクティブ月(1月から11月)の、次月(2月から12月)のE3およびG3に前月繰越として自動入力する 今回のご教示のお願いは 7.の、残高計算(G列)の最終セルの金額をアクティブ月(1月から11月)の、次月(2月から12月)のE3およびG3に前月繰越として自動入力する ができるようにしたいと思っています。 つたない説明ですが、忖度していただきますようお願いします。

  • akauntook
  • ベストアンサー率19% (295/1481)
回答No.1

間違いが3つあります。 1.カテゴリーが技術者向ですが、質問内容から技術者とは思えない。 2.Visual Basic はVBAではない。 3.Excelブックに関する説明がない。 質問にある問題の原因も、これらに通じるものがあり、現状を正しく認識し、目的のために何が必要か考えて、実施する。 根本的にこれが出来ないと何でも出来ませんよね。

1211M
質問者

お礼

早速のご回答ありがとうございます。 初心者です。

関連するQ&A

  • TextBoxの値を複数シートのセルに記入する

    よろしくお願いします。 TextBoxの値を複数シートのセルに記入するようにしたいのですが 一つのシートにしか記入されません。 醜い構文ですみません。 Private Sub CommandButton1_Click() Dim a As Long Dim b As Long Dim f As Long Dim h As Long Dim c As Range Dim d As Range Dim e As Range Dim g As Range With Worksheets(Array("駐車状態", "材料", "外壁1", "外壁2", "屋根1")).Select Set c = Cells(1, 2) For a = 1 To 140 Step 7 Set c = Union(c, Cells(a, 2)) c = TextBox1.Value Next c.EntireRow.Select Set d = Cells(1, 4) For b = 1 To 140 Step 7 Set d = Union(d, Cells(b, 4)) d = TextBox1.Value Next d.EntireRow.Select Set g = Cells(2, 2) For h = 2 To 141 Step 7 Set g = Union(g, Cells(h, 2)) g = TextBox2.Value Next g.EntireRow.Select Set e = Cells(2, 4) For f = 2 To 141 Step 7 Set e = Union(e, Cells(f, 4)) e = TextBox2.Value Next e.EntireRow.Select End With End Sub

  • セルの値でなくセルの関数を参照したい

    次のコードでセルI13の値を入力できましたが、 '---------------------- 'Dim i As Integer 'For i = 2 To Worksheets.Count - 6 'With Worksheets(i) '.Range("I13") = Worksheets(1).Range("I13").Value 'End With 'Next セルの値でなく関数を入力しようとして次のコードに修正したらエラーになりました。どこがいけないのでしょうか。 Dim i As Integer For i = 2 To Worksheets.Count - 6 With Worksheets(i) .Range("I13").Formula = "=" & Worksheets(1).Name & "!I13" End With Next

  • Excel VBA For Each Next構文内の別シートを対象とする方法

    こんにちは。 VBA初心者のものですが教えてください。 「sheet1のC29:U29とsheet2のC31:G31について 1より小さければ小数第2位まで表示する」 の構文を作成したいのですが、 下記の構文ではエラーが出てしまいました。 どのように訂正すればよいでしょうか? ※できればrangeプロパティを使いたいのですが、  cellsプロパティを使わなきゃできませんか? すみませんがご教示をお願いいたします。 Sub test() Dim myrange As Range For Each myrange In Worksheets("sheet1").Range("C29:U29"),Worksheets("sheet2").Range("C31:G31") If myrange.Value < 1 Then myrange.NumberFormatLocal = "0.00" End If Next myrange End Sub

  • インデックスが有効範囲に出ないと出る

    下記のようなVBAを書きました。しかしインデックスが有効範囲にないとメッセージがでるのですが、どこがまちがっているでしょうか?? Sub macro1() Dim i As Long Dim r As Long Worksheets("フェアリスト ").Select Worksheets("csv").Range("A:C").ClearContents For i = 2 To 50 Step 5 If Worksheets("フェアリスト").Cells(11, i + 1) <> "" Then r = Worksheets("フェアリスト").Cells(65536, i + 1).End(xlUp).Row Worksheets("フェアリスト").Range(Cells(11, i), Cells(r, i + 3)).Copy _ Destination:=Worksheets("csv").Range("B65536").End(xlUp).Offset(1) Worksheets("csv").Range("A65536").End(xlUp).Offset(1).Resize(r - 3, 1).Value = Worksheets("フェアリスト").Cells(8, i).Value End If Next i Worksheets("csv").Range("A1:C1").Delete shift:=xlShiftUp End Sub

  • VBAでF(I) = 1# / Exp(TT)の値がセルに0と表示され

    VBAでF(I) = 1# / Exp(TT)の値がセルに0と表示されてしまう問題があります。 TTやExp(TT)の値はそれなりの数値がでるのですが、F(I) だけが0となってしまいます。 どうのようにすれば正しくひょうじされるでしょうか? また、CDblの位置は下記の場所であっているのでしょうか? 以上ご回答よろしくお願いします。 Private Sub CommandButton1_Click() Dim X(500) As Double Dim Y(500) As Double Dim F(500) As Double Dim FI(500) As Double Dim N As Integer Dim DX As Double Const Pi = 3.141592654 Dim I As Integer Dim TT As Double N = Range("_N") DX = Range("_DX") '-----------------------<データを自動生成している。ここから F(1) = 0.5 For I = 2 To N TT = DX * CDbl(I - 1) F(I) = 1# / Exp(TT) Next I '-----------------------<データを自動生成している。ここまで Worksheets("Sheet1").Range("E4:E30").Value = TT Worksheets("Sheet1").Range("F4:F30").Value = Exp(TT) Worksheets("Sheet1").Range("G4:G30").Value = F(I) End Sub

  • 他のブックでマクロを実行するには?

    以下のマクロを実行すると同一ブック内の他のシートに入力 されますが、これを他のブックのシートに入力されるように するには、具体的にどのようにすればいいのでしょうか? ご教授ください。 ---------------------------------------------------------------- Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1 .Range("B" & LastRow).Value = Worksheets("sheet1").Range("B1").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("B3").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("B5").Value .Range("E" & LastRow).Value = Worksheets("sheet1").Range("B7").Value .Range("F" & LastRow).Value = Worksheets("sheet1").Range("B9").Value .Range("G" & LastRow).Value = Worksheets("sheet1").Range("B11").Value End With End Sub

  • VBA 最終行の値を取得

    Excel2007です。 印刷用シートに、用紙を4分割して、4件分のカードを印刷できるようにしてあります。 A1, F1, A10, F10の入力セルに、それぞれデータシートのNo.を入れると、vlookupで連動されるようになっています。 No.の入力セルは、4ずつ加算されるようにVBAを書きました。 さらに、データシートの最終No.を超えた場合に、メッセージボックスを出したいのですが、うまくいきません。 例えば、データシートが200件まで入力されているとして、印刷シートのNo.に「201」を入力すると、「これ以上データがありません」というメッセージを表示させたいです。 Sub 次データ() Dim 最終行 As Long, 最終値 As Long Dim my As String 最終行 = Worksheets("データ").Range("A1048576").End(xlUp).Row 最終値 = Cells(最終行, 1) Worksheets("印刷用").Select Range("A1").Value = Range("A1") + 4 Range("F1").Value = Range("F1") + 4 Range("A10").Value = Range("A10") + 4 Range("F10").Value = Range("F10") + 4 If Range("A1") > 最終値 Or Range("F1") > 最終値 Or Range("A10") > 最終値 Or Range("F10") > 最終値 Then my = MsgBox("これ以上データがありません", vbOKOnly + vbExclamation, "注意!") End If End Sub このように書いてみましたが、これだと「次データ」を実行する度にメッセージボックスが出てしまいます。 どこを直せばいいのでしょうか。 分かりづらい文章ですみません。 なにぶん、VBAをかじりかけたばかりで、ド素人ですのでよろしくお願いします。

  • セルの値をシート名にするエクセルVBA

    件名のVBAを以下のように書きました B列の4からずっと下までのセルの値を次々とシート「ひな型」をコピーし増やしていくものです。 Sub テスト() ' ' Macro ' ' Dim target As Range Dim h As Range '見えてるセルを取得する。「全部隠れていた」場合も考える。 On Error Resume Next Set target = Worksheets("Sheet1").Range("B4:B" & Worksheets("Sheet1").Range("B65536").End(xlUp).Row).SpecialCells(xlCellTypeVisible) If target Is Nothing Then Exit Sub 'シートを増やしていく For Each h In target On Error GoTo errhandle Worksheets(CStr(h.Value)).Select On Error GoTo 0 Next Sheets("Sheet1").Select Exit Sub errhandle: Worksheets("ひな型").Copy after:=Worksheets(Worksheets.Count) ActiveSheet.Name = h.Value Resume End Sub これだと、一応思った通りにはなるのですが B列のセルに複数同じ名前があった時に、既に作ったシートの名前がある場合 それは無視するという風に実行したいです お知恵をお貸しくださいませ

  • Excel VBA 構文をすっきりさせたい

    いつもお世話になっています。 次のような構文を使って、データを別シートに転送するVBAを作成しました。 転送するデータが多い場合、構文が延々続くことになります。 もっとすっきりと記述する方法がありましたらぜひ教えてください。 お力添え、よろしくお願いします。 Sub データ() With ActiveSheet Dim last last = ActiveSheet.Range("b" & Rows.Count).End(xlUp).Row + 1 .Range("b" & last).Value = Worksheets(2).Range("b2").Value .Range("c" & last).Value = Worksheets(2).Range("c2").Value .Range("d" & last).Value = Worksheets(2).Range("d2").Value     以下同様に続く・・・・ End With End Sub

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

専門家に質問してみよう