• ベストアンサー

エクセル

シート1~5まであります。別に情報シートを作成しています それぞれ同じ原本から作成しています 全部のシートにA1~A10のセルに日付、B1~B10のセルに文字など入力がするところがあります 入力はA1から順番に入れていきます 例えば 保存ボタンを作成しておく シート1のA1に日付、B1に”文字”を入力し、保存ボタンをおす 情報シートに日付と内容が一致する情報がなければ、 情報シートのA列にシート名、B列に日付、C列に入力した内容が 空白のところに出力される こんな感じに作成できないでしょうか?

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.3

シート1~5それぞれのシートにボタンがあって、そのシートのボタンを押すとそのシートの最終行の日付と文字が情報シートにあるデータと一致しなければ情報シートにデータを追加する ということだとしたら以下のような感じでしょうか。 ボタンのマクロがCommandButton1_Clickとしたら Private Sub CommandButton1_Click() 検索 End Sub 標準モジュールに Sub 検索() Dim c As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1LastRow As Long Dim ws2LastRow As Long Set ws1 = Sheets("情報シート") Set ws2 = ActiveSheet If ws2.Range("A1").Value = "" Or ws2.Range("B1").Value = "" Then MsgBox "検索する日付もしくは語句が入力されていません。", vbCritical Exit Sub End If If ws1.Range("A1").Value = "" Then ws1LastRow = 0 Else ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row End If ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row For Each c In ws1.Range(ws1.Cells(1, "B"), ws1.Cells(Rows.Count, "B").End(xlUp)) If c.Value2 = ws2.Cells(ws2LastRow, "A").Value2 Then If c.Offset(0, 1).Value = ws2.Cells(ws2LastRow, "B").Value Then MsgBox "既にデータが存在します", vbInformation Exit Sub End If End If Next ws1.Cells(ws1LastRow + 1, "A").Value = ws2.Name ws1.Cells(ws1LastRow + 1, "B").Resize(1, 2).Value = ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value MsgBox "データを追加しました", vbInformation Set ws1 = Nothing Set ws2 = Nothing End Sub

jikkenn
質問者

お礼

ありがとうございます 親切な説明文もついていて助かります

jikkenn
質問者

補足

完璧なプログラムありがとうございます もしも今後D列とか追加したいものとか出てきた場合 どこら辺のプログラムをいじれば列を増やせるのでしょうか? ご迷惑をお掛けしますが 返事もらえるとうれしいです

その他の回答 (5)

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.6

No5の追加です。 入力してるかどうかの判断もC列まで増やさないといけないので変更になります。 If ws2.Range("A1").Value = "" Or ws2.Range("B1").Value = "" Or ws2.Range("C1").Value = "" Or _ ws2.Cells(Rows.Count, "A").End(xlUp).Row <> ws2.Cells(Rows.Count, "B").End(xlUp).Row Or _ ws2.Cells(Rows.Count, "B").End(xlUp).Row <> ws2.Cells(Rows.Count, "C").End(xlUp).Row Then MsgBox "検索する日付もしくは語句が入力されていません。", vbCritical Exit Sub End If

jikkenn
質問者

お礼

ありがとうございます これだけ教えて貰えたら 自分で追加できます

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.5

> もしも今後D列とか追加したいものとか出てきた場合 > どこら辺のプログラムをいじれば列を増やせるのでしょうか? 増えるD列が情報シートだとすれば情報シート以外はC列になると思いますのでC列まで検索に含める場合 If c.Value2 = ws2.Cells(ws2LastRow, "A").Value2 Then If c.Offset(0, 1).Value = ws2.Cells(ws2LastRow, "B").Value Then If c.Offset(0, 2).Value = ws2.Cells(ws2LastRow, "C").Value Then MsgBox "既にデータが存在します", vbInformation Exit Sub End If End If End If If文が一つ増えることになります。この検索方法がベストかどうかは不明ですが、とりあえず頭に浮かんだので…データ量がそれほど多くないと思われたので検索スピードに関しては考えていません。 あとデータの代入ですが、シート名以外の部分は以下になります。シート名の代入ははそのままです。 ws1.Cells(ws1LastRow + 1, "B").Resize(1, 2).Value = ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value Resize(y,x)が基点のセルから基点のセルも含めてどれだけのセル範囲を対象とするかの指定になります。 B列も含めたD列までの範囲は1行3列分となりますから ws1.Cells(ws1LastRow + 1, "B").Resize(1, 3).Value と指定してください。 情報シート以外も列が同数増えると思いますので ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value も ws2.Cells(ws2LastRow, "A").Resize(1, 3).Value になります。

jikkenn
質問者

お礼

ありがとうございます 工夫して増やしてみます

  • kkkkkm
  • ベストアンサー率65% (1608/2445)
回答No.4

No3です。 検索の方の訂正です。 日付、検索語句の未入力確認を一部訂正しました。 Sub 検索() Dim c As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1LastRow As Long Dim ws2LastRow As Long Set ws1 = Sheets("情報シート") Set ws2 = ActiveSheet If ws1.Range("A1").Value = "" Then ws1LastRow = 0 Else ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row End If ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row If ws2.Range("A1").Value = "" Or ws2.Range("B1").Value = "" Or _ ws2.Cells(Rows.Count, "A").End(xlUp).Row <> ws2.Cells(Rows.Count, "B").End(xlUp).Row Then MsgBox "検索する日付もしくは語句が入力されていません。", vbCritical Exit Sub End If For Each c In ws1.Range(ws1.Cells(1, "B"), ws1.Cells(Rows.Count, "B").End(xlUp)) If c.Value2 = ws2.Cells(ws2LastRow, "A").Value2 Then If c.Offset(0, 1).Value = ws2.Cells(ws2LastRow, "B").Value Then MsgBox "既にデータが存在します", vbInformation Exit Sub End If End If Next ws1.Cells(ws1LastRow + 1, "A").Value = ws2.Name ws1.Cells(ws1LastRow + 1, "B").Resize(1, 2).Value = ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value MsgBox "データを追加しました", vbInformation Set ws1 = Nothing Set ws2 = Nothing End Sub

jikkenn
質問者

お礼

修正ありがとうございます

回答No.2

> こんな感じに作成できないでしょうか? 多分、できますよ。 ただし、他の回答者様のために補足してあげてください。 (1)マクロ(VBA)は理解できますか? (2)シート1~5は同じ作りですか?  同じなら、複数保持している理由・使い分けの方法も添えて。 (3)半角全角、英字の大文字小文字、撥音拗音などなど区別はしますか? (4)保存ボタンの場所はどの辺りとお考えですか? 当面、これくらいの情報があれば恐らく作れます。 なお、最も重要な情報は(1)です。

  • ushi2015
  • ベストアンサー率51% (241/468)
回答No.1

こんにちは Sub 保存()   Dim i As Long   Dim j As Worksheet   Set j = Worksheets("情報")   With ActiveSheet     If .Name <> j.Name Then       i = WorksheetFunction.CountIfs( _         j.Range("B:B"), .Range("A" & Rows.Count).End(xlUp), _         j.Range("C:C"), .Range("B" & Rows.Count).End(xlUp))       If i = 0 Then         j.Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, 3).Value = _           Array(.Name, _               .Range("A" & Rows.Count).End(xlUp), _               .Range("B" & Rows.Count).End(xlUp))       End If     End If   End With End Sub をボタンに登録して実行とか。

jikkenn
質問者

お礼

ボタンで 保存できました ありがとうございます

関連するQ&A

  • エクセル VBA

    最終行から順番に下へ同列で入力するVBAを教えて下さい。 EXCELのVBAで教えて下さい。 シート1のA列にはB列が入力されると自動入力されるNo.があり、C~G列もB列が入力されると自動入力されます。 B列には日付が、H列には3~4桁の数字が入力したいのですが、 入力行は必ず最下行のセルB、Gな為、VBAでフォームを作成し、 入力実行ボタンを押すことにより、最下行のセルB、Gに反映されるように したいです。 又、上記入力後に、シート2のH~N列をコピーして、シート3のA~G列に値のみの貼り付けを行い保存した後、シート3のA~G列をコピーして csvファイルを作成して保存したいです。 一連の流れを、フォームの入力実行ボタンを押すことで実行したいのですができるのでしょうか? 宜しく御願い致します。

  • EXCELの関数を教えてください。

    シート1 A列には1と2 B列には名前 C列には備考1(入力のあるセルもあればないセルもあり)が入力されたシートがあるとします。行は無限です。 シート2への表示を A列に1が入力されていた時のみC列の備考欄に入力されている文字をかえし、空白の場合は空白にしたいのです。 A列に2が入力されている場合は全部が空白です。 IFとISBANKの組み合わせみたいな感じなんですがよく分かりません。宜しくお願いします。

  • Excelで違うシートから日付を引っ張ってきたい

    すいませんが教えてください。 EXCELでAのシートとBのシートがあって、 Aのシートに日付を入力していきます。 その日付をBシートに引っ張ってきたいのですが、 ='Aシート'!A2 とBシートのA2に入れると Aシートの空白セルでは 「1月0日」となってしまいます。 空白セルは同じように空白セルにしたいのですが、 やり方がわかりません。 よろしくお願いします。

  • エクセル マクロ修正

    シート1~5まであります。別に情報シートを作成しています それぞれ同じ原本から作成しています 全部のシートにA1~A10のセルに日付、B1~B10のセルに文字など入力がするところがあります 入力はA1から順番に入れていきます 例えば 保存ボタンを作成しておく シート1のA1に日付、B1に”文字”を入力し、保存ボタンをおす 情報シートに日付と内容が一致する情報がなければ、 情報シートのA列にシート名、B列に日付、C列に入力した内容が 空白のところに出力される ボタンのマクロがCommandButton1_Clickとしたら Private Sub CommandButton1_Click() 検索 End Sub 標準モジュールに Sub 検索() Dim c As Range Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws1LastRow As Long Dim ws2LastRow As Long Set ws1 = Sheets("情報シート") Set ws2 = ActiveSheet If ws2.Range("A1").Value = "" Or ws2.Range("B1").Value = "" Then MsgBox "検索する日付もしくは語句が入力されていません。", vbCritical Exit Sub End If If ws1.Range("A1").Value = "" Then ws1LastRow = 0 Else ws1LastRow = ws1.Cells(Rows.Count, "A").End(xlUp).Row End If ws2LastRow = ws2.Cells(Rows.Count, "A").End(xlUp).Row For Each c In ws1.Range(ws1.Cells(1, "B"), ws1.Cells(Rows.Count, "B").End(xlUp)) If c.Value2 = ws2.Cells(ws2LastRow, "A").Value2 Then If c.Offset(0, 1).Value = ws2.Cells(ws2LastRow, "B").Value Then MsgBox "既にデータが存在します", vbInformation Exit Sub End If End If Next ws1.Cells(ws1LastRow + 1, "A").Value = ws2.Name ws1.Cells(ws1LastRow + 1, "B").Resize(1, 2).Value = ws2.Cells(ws2LastRow, "A").Resize(1, 2).Value MsgBox "データを追加しました", vbInformation Set ws1 = Nothing Set ws2 = Nothing End Sub これを教えて頂き作っていたのですが 別のシートを作成しこのプログラムを応用していたのですが うまく起動しないため再度投稿しました 今度のやつは固定でやろうと思っていていじったのですが 別の欄の文字が表示してしまった 結合セルB2:C4に日付を入れる 結合セルL2:L30に内容を入れるようにしたいのですが ここだけのセルを参照するようにしたいのです。 どうすればいいでしょうか? 試したことAをB2にかえ、BをL2にしたら変なことになりました・・・

  • エクセルExcelでの空白を詰めてのデータ抽出の方法

    ぜひ力を貸してください(>_<) Sheet1は入力専用で A列は日付で固定、B列に入力をします。B列は空白が多いです。  A  B 7/20 7/21 160 7/22 7/23 230 7/24 185 7/25 これをSheet2にB列の空白を詰めて 日付順に表記させたいです  A  B 7/21 160 7/23 230 7/24 185 Sheet2の関数式を教えていただきたいです よろしくお願いいたします

  • エクセル シート自動作成

    A1に2016年、B1に8月などと入力した時 A2~A15に日付を自動出力 B2~B15に曜日を自動出力 C2~C15に文字列&日付で自動表示するファイルを作成しました A1 2016年 B2 8月 A列  B列  C列 1日 月曜日 名前8月1日 2日 火曜日 名前8月2日 3日 水曜日 名前8月3日 ・ ・ C列のC2~C15の名前でシートを自動的に作成出るようにしたいのですが たとえばボタンを作成しボタンを押したときにシートが自動的に作成される または年と月を入れた際に自動的にシート作成されるようにしたいのですが さらにシートは原本を作っているのでそれをもとにコピーされるように したいのですが? どうすればいいでしょうか? お手数ですが宜しくお願いします。

  • 同じ数字の時塗りつぶす エクセル

    Sheet1のA1セルからH1セルまでに日付が入っています(1月1日~1月7日) Sheet2のA1セルには赤、B1には白と文字入力しており、A2~B32までそれぞれ日付が入力してあります。(日付のダブりはありません) 例:A2~A9までは1月1日~1月7日 B10~B17は1月8日~1月15日といったような Sheet1のA1セルに日付を入力したときにSheet2の赤または白に日付が該当する場合にその色で自動的に塗りつぶすような動作はできないでしょうか? 例えばSheet1のA1セルに1月1日と入力した場合、Sheet2ではA列(赤)に1月1日と記載があった場合そのタブ1のA1セルが塗りつぶされるといった内容です。 お手数ですがご回答のほどよろしくお願いいたします

  • エクセル、コマンドボタンについて

    素人な質問ですみません。 シート1にコマンドボタンを作成しています。 このコマンドボタンを押すと、シート2のA1セルからE10セルに入力してある50の文字列から、ランダムにコマンドボタンのあるシート1のA1セルに表示させるようにしたいのですが。 このようなことは出きるでしょうか? VBAの知識もほとんどなく困ってます。 簡単に言うと、コマンドボタンを使って、別シートに入力してある文字列を表示させる方法ということになるでしょうか。 よろしくお願いします。

  • Excel 空白セルのコピペについて

    http://imgur.com/5e8TsP1 上記図のように、シート1のB列に各文字を入力しています。 そして、A列にはもしB列に文字が入力されていたらID代わりの数値を表示する、という式を入力してあります。 次に、シート1のA列、B列をコピーして、シート2に数値としてペーストをします。 すると、A列は空白のはずが、xldown操作をすると元のセルで式が入力されていたものまで選んでしまい、真の空白セルとして認識してくれません。 そこで、このような例の場合、どうコピーペースト、または選択をすれば偽物の空白 セルを生み出さないように出来るでしょうか? 実際に使用するデータは項目名が多く存在し、マクロですべてのセルを選択→新規ブックを作成してそこにペースト、という処理を行っています。 この時に偽物の空白セルが出ると、データベースに読みこむ際に不都合が生じますので、何とか改善を図りたいです。 VBA、関数、Excel上のテクニックのいずれでも構いませんので、どうかご教授下さい。 よろしくお願いいたします。

  • エクセル2000で教えて下さい。

    エクセル2000で質問です シート1のA列に日付が入っています。 B列に東京、大阪・・・数種類の文字が入ります。 C列に数字が入力されています。 日々それぞれ入力されていく形になっています。 さらにシート2のA列に日付が入っています。 B列には予めすべて大阪と入力されています。 C列には数字が入るようになっているのですが 例えばシート1のセルA3に10月18日と入ってB3に大阪と入った時には C3に入った数字と同じ数字がシート2のC3に入力されるようにしたいのです。 シート2のC3と言うのはA3にシート1のA3と同じ日付が入って いるから隣のC3に入る形です。 上の場合もしA8に10月18日と入っていればC8にシート1のC3と 同じ数字が入るようにしたいのです。 シート1のB列に大阪以外の文字が入った場合は無視です。 大阪と入った場合のみです。 どなたか御教授下さい。 補足が必要なら申し付け下さい。

専門家に質問してみよう