• ベストアンサー

エクセルVBAで検索してシートへ貼り付け。

どうも。 エクセルでVBAをやっています。 表に映画のデータベースのように打ち込んで VBAフォームでタイトルを検索して、ヒットした行を別シートに出力するというのがやりたいのですが、できないのです。 Private Sub CommandButton1_Click() '変数の宣言 strTitle = "" intEndIndex = 0 intTate = 1 intYoko = 1 With Workbooks("book1.xls").Sheets(1) strTitle = UserForm3("TextBox1") i = 1 Do Until .Cells(i, 1) = "" i = i + 1 Loop 'A1から下へ空白がでるまで検索する感じです。 intEndIndex = i - 1 Do Until intTate > intEndIndex If strTitle = "" Then Exit Do ElseIf InStr(1, .Cells(intTate, intYoko), strTitle) > 0 Then End If intTate = intTate + 1 Loop End With End Sub 検索することはできるのですが、 ヒットした行(タイトルや監督や制作年、出演者などが表に書いてある)を別シートに貼り付ける方を教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.6

こんばんは。#1です。 どうでしょうか。考えはまとまりました? わたしの方でもなんとかならないかと考えてみました。 #5で回答した中にあった、オートフィルタを使って、 リストをピックアップするサンプルです。 なにか参考になればと思います。 条件として、A,B,C,D,Eの各列に  タイトル、制作年、監督、主演、ジャンル が入力されているものとします。 1行目は見出しの行であるものとし、 2行目以降から映画のデータが入っていることとします。 フォームには、5つのテキストボックス(TextBox1~5)と、 ひとつのコマンドボタン(CommandButton1)を用意しました。 TextBox1が、「タイトル」の検索用文字列を入力するボックスとし、 以下、制作年、監督、主演、ジャンルを5つのテキストボックスに入力するものとします。 ※質問ではコンボボックスとなっていましたが、 テキストボックスで作りましたので、適宜作り替えてみてください。 検索は、キーワードに完全に一致するものを抽出します。 部分一致検索にしたいときは、キーワードにワイルドカードを指定します。 たとえば、「*ニック」と入力すると「タイタニック」がヒットします。 ヒットした映画のデータを、 コピーペーストするところまでのコードは書いていませんが、 このコードが理解できれば道のりはそう遠くないはずです。 がんばってみてください^^。 Private Sub CommandButton1_Click() Dim txtCriteria(1 To 5) As String '検索キーワード Dim i As Long 'ループ用 'オートフィルタモードのオン Selection.AutoFilter 'TextBoxの値を取得(5回ループ) For i = LBound(txtCriteria) To UBound(txtCriteria)  'TextBoxの検索文字列を取得  txtCriteria(i) = Me.Controls("Textbox" & i).Value  'キーワード文字列にあうものを抽出(条件入力時のみ)  If Len(txtCriteria(i)) > 0 Then    Selection.AutoFilter Field:=i, Criteria1:=txtCriteria(i)  End If Next i End Sub

sukizuki
質問者

お礼

こんにちは。回答ありがとうございます。 またまた返事が遅れてしまい申し訳ございません。 オートフィルタなんてすごい機能があったのですね。 ちょっと敷居が高いですが、挑戦してみました。 happypointさんのサンプルで抽出することは上手くできたのですが、シートへの貼り付けが出来ないです><;。 今までのを全部振り返りながらやっているのですが、 思ったようにできなくて困ってます。 でも、今まででみなさんにかなりのアドバイスを頂いたので、あとは自分で頑張ろうと思います。 今の段階では基礎が出来てないなのでコードの一つ一つの意味を理解するのに時間がかかり、皆さんに迷惑かけてしますので、一から学習しながら作り上げたいと思います。 基礎を身につけたうえで、また分からないことがあったら質問させていただきます。 親身にアドバイスしてくださいまして非常に嬉しく感謝しております。本当に有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (6)

noname#11856
noname#11856
回答No.7

#4の補足に書かれているInStrを使ったIf文を下記のように変えてみても うまくいかないでしょうか? ・・・風邪ひいてぼーっとした頭なのでなんだかよくわかりませんが。(笑) If (strTitle = "" Or InStr(1, .Cells(lngRow1, lngYoko).Value, strTitle) > 0) And _ (strYear = "" Or InStr(1, .Cells(lngRow1, 2).Value, strYear) > 0) And _ (strKantoku = "" Or InStr(1, .Cells(lngRow1, 3).Value, strKantoku) > 0) And _ (strShuen = "" Or InStr(1, .Cells(lngRow1, 4).Value, strShuen) > 0) And _ (strGenre = "" Or InStr(1, .Cells(lngRow1, 5).Value, strGenre) > 0) Then あと、#2のお礼欄に書かれてるC6が選択される・・・というのは なんでしょうね? そうなるように作った覚えはないんですけど。(笑) えー・・・Sheets(2).Selectの前に、.Range("A1").Selectとでもしておけば 常にA1を指して終わる事はできますけど。。。そういう問題じゃないのかな。。。

sukizuki
質問者

お礼

こんにちは。回答ありがとうございます。 サンプルのとおりにしたのですが、コマンドボタンを押下しても何の反応もしませんでした。 基礎が出来ていないので、どう直したらいいか分からないので、一から勉強してやってみます。 C6が選択されるのは何でしょうね。コードに何かまぎれてるかもしれないです。そういうのが分かるように頑張っていきたいと思います。 色々アドバイスくださいましてありがとうございます。 最近、朝が寒くて僕も風邪ひきかけています^^。 お大事にしてくださいね。 有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.5

こんにちは。ふたたび#1です。 >複数検索全てにヒットするのを出力するというのは課題が重すぎました お悩みのようですね。 複数検索条件のロジックを自前で書こうとすると、 わたしでも3日ぐらいかかってしまいそうです^^; (蛇足ですが・・・ 通常このような検索主体の機能をつけるなら、Accessを使った方が何かと便利です。 標準機能だけで複数条件を指定して検索できます。) しかし、Excelでできないわけではありません。 ExcelVBAのいいところは、Excelがもっている便利な機能を、 おいしいところだけつまみ食いできるところです。 「オートフィルタ」の機能をご存じですか? これは今回のようなケースのためにあるような機能です^^ これをうまく使ってやれば、複数条件による抽出の部分は、 自前でコーディングしなくても、エクセルがやってくれるはずです。 いちど、「オートフィルタ」を手作業で操作してみて、 複数条件で抽出できないか、やってみてください。 もしこれができるならば(きっとできます!)、 あとあなたが考えなければいけないのは、 テキストボックスに入力した条件をオートフィルタに渡しオートフィルタがピックアップした結果を、 別シートにコピーする処理だけです。 VBAでオートフィルタを設定する条件の書き方がわからないときは、 マクロ記録で手作業したものを開いてみれば良いでしょう。 どうですか?わかりそうですか?

全文を見る
すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.4

#1です。こんにちは。 >2回目の検索の結果を1回目の検索の結果に上書きではなく、 >その下の行から追加という形で出力 向上心が旺盛でいらっしゃいますね。^^ わたしのコードを修正する場合は、次の手順で修正してみて下さい。 (1) まず、変数の定義に、次の行を追加してみてください。  Static lngOffset As Long この変数は、マクロが終わってもクリアされない「静的変数」として定義しています。 この変数で、前回の検索でシート2の何行目まで貼り付けたか、を覚えておくことができます。 (2) つぎに、初期化のところを、こう変更します。 前のコードでは毎回1行目から貼り付けしていましたが、 今回は最終行以降に追加で貼り付けます。  '初期化  lngRow2 = lngOffset + 1 '前回検索して貼り付けたデータの、最終行の次の行に貼り付ける (3) 最後に、最終行(End Subの直前)に、以下のコードを追加してください。 こうすることで、検索するごとに何行目まで貼り付けたかを記憶させることができます。  lngOffset = lngRow2 - 1 '貼り付け先の最終行を記憶

sukizuki
質問者

お礼

早速の回答ありがとうございます。 できました。感動ですね^^。 回答読みながら「こうゆう手順でやるのかぁ」 とただただ驚くばかりです。 はやくhappypointさんのような考えが浮かぶようになりたいです。 まだまだ初心者の私は複数検索全てにヒットするのを出力するというのは課題が重すぎました。色々奮闘したのですが、これ以上考えがでてこない感じです。 ですので、御教授いただけると嬉しいです。 長くなるので補足に記入しときます。 ありがとうございました。

sukizuki
質問者

補足

はじめに回答くださったみなさんありがとうございました。 タイトルだけを検索して出力する方法をみなさんに教えていただき、それを応用して複数検索しようと挑んだのですが、まったくわからなくまた質問させていただきます。 フォームにはテキストボックス(タイトル、制作年、監督、主演)が4つとコンボボックス(ジャンル)が1つあって、その5つに入力した文字すべてと一致するものを出力したいのです。No.1の方の回答をもとに Const lngTate As Long = 1 '行番号 Const lngYoko As Long = 1 'タイトルの列番号(固定) Dim lngMaxRow As Long 'データの最終行 Dim lngRow1 As Long '貼り付けもとの行 Dim lngRow2 As Long '貼り付け先の行 Dim strTitle As String Dim strYear As String Dim strKantoku As String Dim strShuen As String Dim strGenre As String Static lngOffset As Long With Workbooks("book2.xls").Sheets(1) strTitle = TextBox1.Value strYear = TextBox2.Value strKantoku = TextBox3.Value strShuen = TextBox4.Value strGenre = ComboBox1.Value '初期化 lngRow2 = lngOffset + 1 'Textの取得 If TextBox1.Value = "" Then Exit Sub strTitle = TextBox1.Value If TextBox2.Value = "" Then Exit Sub strYear = TextBox2.Value If TextBox3.Value = "" Then Exit Sub strKantoku = TextBox3.Value If TextBox4.Value = "" Then Exit Sub strShuen = TextBox4.Value If ComboBox1.Value = "" Then Exit Sub strGenre = ComboBox1.Value '項目数を把握 Worksheets(1).Select Cells(ActiveSheet.Rows.Count, lngYoko).End(xlUp).Select lngMaxRow = Selection.Row '検索して合致したらコピペ For lngRow1 = 1 To lngMaxRow If InStr(1, Cells(lngRow1, lngYoko).Value, strTitle) > 0 _ And InStr(1, Cells(lngRow1, 2).Value, strYear) > 0 _ And InStr(1, Cells(lngRow1, 3).Value, strKantoku) > 0 _ And InStr(1, Cells(lngRow1, 4).Value, strShuen) > 0 _ And InStr(1, Cells(lngRow1, 5).Value, strGenre) > 0 Then Rows(lngRow1).Copy Sheets(2).Cells(lngRow2, 1).PasteSpecial lngRow2 = lngRow2 + 1 End If Next lngRow1 '結果の表示 Worksheets(2).Select lngOffset = lngRow2 - 1 End With End Sub というところまでやったのですが、これだと全てのボックスに文字を入力しないと検索できません。 一つでも未記入のボックスがあると検索ボタンを押しても反応なしです。  InStr(1, Cells(lngRow1, lngYoko).Value, strTitle) > 0 が0なので空白だと一致しないというのは分かるのですが、空白ボックスがあっても検索できて、なおかつ入力した文字が全て含まれているものだけを出力したいのです。 例えば、タイトル「タイタニック」、制作年「1998」、監督「ジェームスキャメロン」、主演「レオナルド・ディカプリオ」、ジャンル「恋愛」という行があって、 タイトル「タイタニック」・ジャンル「恋愛」(制作年、監督、主演は未入力)と入力して他の行にジャンル「恋愛」のものがあってもタイタニックのみヒットさせたいのです。 非常に長くなってすいませんが、よろしくお願いいたします。

全文を見る
すると、全ての回答が全文表示されます。
  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

私は馬鹿の1つ覚えでいつも下記で考えてます。 コピーは使いません、代入で済まします。CurrentRegionはクセがあるかもしれません。 文字数の多いDIMによる定義は、本当はすべきなんですが 、読みづらいだろうと勝手に1文字を多用してます。 Sub test01() Dim sh1, sh2 As Worksheet Set sh1 = Worksheets("sheet1") Set sh2 = Worksheets("sheet2") j = 1 'Sheet2のデータをセットする始まり行 u = 2 'Sheet1のデータ部の始まり行 d = sh1.Cells(u, 1).CurrentRegion.Rows.Count s = InputBox("検索文字列=") For i = u To u + d If InStr(Cells(i, 1), s) <> 0 Then  For k = 1 To 4 'D列までデータがあると仮定  sh2.Cells(j, k) = sh1.Cells(i, k)  Next k  j = j + 1 End If Next i End Sub

sukizuki
質問者

お礼

回答ありがとうございます。 お返事遅れてしまいごめんなさい。会社からつないでるんで。 VBAをはじめたばかりであんまり分からないですが、できなかったです。 Sub Test01のとこをSub CommandButton1_Click()として入力すればいいんですか。 それでやると d = sh1.Cells(u,1).CurrentRegion.Rows.Count のとこがエラーになって「オブジェクトが必要です」となります。 どこを変えたらいいのかも全然わからずです。 勉強不足なので誠に申し訳ないです。

全文を見る
すると、全ての回答が全文表示されます。
noname#11856
noname#11856
回答No.2

・・・先を越されましたが、投稿。(笑) ちょっと違うので、こんな風にもできますよー的なものとしてご参照ください。(^-^; 指摘ポイントはhappypointさんを同じです。 行の変数をIntegerからLongにしているのは、Excelは最大65536行ありますので Integer(整数)型では処理し切れなくなる可能性があるためです。 ・・・多分、そこまで入れないんでしょうけど・・・。 Private Sub CommandButton1_Click() '変数の宣言 Dim strTitle As String '検索対象文字列 Dim lngCRow As Long 'コピー元行 Dim lngPRow As Long 'コピー先行 '検索対象文字列の取得 strTitle = UserForm3("TextBox1").Value If strTitle = "" Then Exit Sub With Worksheets(1) lngCRow = 1 lngPRow = 1 'A列が空になるまでループ Do Until IsEmpty(.Cells(lngCRow, 1)) If InStr(.Cells(lngCRow, 1).Value, strTitle) > 0 Then .Rows(lngCRow).Copy Worksheets(2).Cells(lngPRow, 1).PasteSpecial Application.CutCopyMode = False 'コピー時の枠がうじゃうじゃしてるのを止める(笑) lngPRow = lngPRow + 1 End If lngCRow = lngCRow + 1 Loop End With End Sub

sukizuki
質問者

お礼

回答ありがとうございます。 お返事遅れてすいません。会社からここにつないでいるもので。Long型にするのはそうゆうことなんですね。そのぐらいデータいれるぐらい映画を知ろうと思います^^。 非常に簡潔なコードありがとうございます。 無事に検索できました。 質問なのですが、検索終わったときにシート1のセルC6がセレクトされるのはどうしてでしょうか?あと、2回目の検索の結果を1回目の検索の結果に上書きではなく、その下の行から追加という形で出力するのはどのようにするのでしょうか? また質問しちゃってすいません。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • happypoint
  • ベストアンサー率36% (521/1422)
回答No.1

こんにちは。 全体的に良くできていると思いますが、 気になる点がありましたので、いくつか指摘しておきます。 まず「変数の宣言」と書いてあるところですが、 これは単に変数の代入をしているに過ぎません。 Dim文を使って、型を宣言しましょう。 つぎに  strTitle = UserForm3("TextBox1") ですが、  strTitle = TextBox1.Value と明確に値(テキスト)を代入したほうがいいと思います。 それからDo-Loopで処理している部分が多いのですが、 もうちょっと処理の構造を見直したほうがいいですよ。 できるならFor-Nextを使ったほうが、無限ループに陥る可能性がなくなります。 わたしなりに、書き直したものを乗せておきます。 参考にしてみてください。 Option Explicit Private Sub CommandButton1_Click() '変数の宣言 Const lngYoko As Long = 1 'タイトルの列番号(固定) Dim lngMaxRow As Long 'データの最終行 Dim lngRow1 As Long '貼り付けもとの行 Dim lngRow2 As Long '貼り付け先の行 Dim strTitle As String 'テキストボックスの文字列 '初期化 lngRow2 = 1 'Textの取得 If TextBox1.Value = "" Then Exit Sub strTitle = TextBox1.Value '項目数を把握 Worksheets(1).Select Cells(ActiveSheet.Rows.Count, lngYoko).End(xlUp).Select lngMaxRow = Selection.Row '検索して合致したらコピペ For lngRow1 = 1 To lngMaxRow  If InStr(1, Cells(lngRow1, lngYoko).Value, strTitle) > 0 Then   Rows(lngRow1).Copy   Sheets(2).Cells(lngRow2, 1).PasteSpecial   lngRow2 = lngRow2 + 1  End If Next lngRow1 '結果の表示 Worksheets(2).Select End Sub

sukizuki
質問者

お礼

回答ありがとうございます。 お返事遅れてすいませんです。会社からやっているもんで、対応が遅れてしまいました。 Dimを使って宣言をするんですね。VBAは勉強し始めたばかりなのでほとんどわからないです。型宣言しないとVariant型にはいってしまうのですね。 happypointさんのおっしゃるとおりFor-Next文使ったほうがいいですね。試行錯誤しているとき何度も無限ループに陥りました^^。 すごい分かりやすい説明ありがとうございました。検索して貼り付けることができました。 最終目標はテキストボックスが5つ(タイトル、制作年、監督、主演、ジャンル)とあって、テキストボックスに記入した文字列に全てヒットしたデータだけ出力するというのが目標なのですが、まだまだ遠いです。 1行のを教えていただいたので応用して頑張りたいと思います。もしまたつまづいてしまったら質問させてもらいますので、そのときはよろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • エクセルVBAで、文字列の検索方法について

    先日、こちらで教えていただいたVBAがあります。 E列のセルの文字列の末尾が「計」のものを検索し、その行に色をつけるものです。 Sub iroiro() Dim x, y x = 1 Do If Right(Cells(x, 5), 1) = "計" Then For i = 2 To 5 Cells(x, i).Interior.ColorIndex = 3 Next End If x = x + 1 Loop Until Right(Cells(x, 5), 1) = "" End Sub これはばっちりで、助かっているのですが、今度は末尾ではなく、文字列中に「営業」という文字があるのを検索し、色をつけたいのです。 If Right(Cells(x, 5), 1) = "計" Thenを どう変えればいいのでしょうか?

  • エクセルVBAについての質問です。

    エクセルVBAについての質問です。 A列のCという商品名が入った列を削除したい場合下記のようにすれば可能かと思いますが、C列のCという商品名が入った列を削除したい場合どのようにすればよいか教えて下さい。 VBAに関してまだ初心者ですがどうぞよろしくお願いします。 行 = 1 Do 行 = 行 + 1 If Cells(行, 1) = "" Then Exit Do End If '行の値がC以外の時は次の行に移る Do If Cells(行, 1) = "C" Then Rows(行 & ":" & 行).Select Selection.Delete Shift:=xlUp Else Exit Do 'ジャンプ先は内側のDo~Loopのすぐ下 End If Loop 'ジャンプ先はここ If Cells(行, 1) = "" Then Exit Do End If Loop End Sub

  • VBAで教えてください。

    データがないときはExitSubしたいのですが、何処に記述すれば良いでしょうか? Sub 削除() Dim i As Long If MsgBox("データを削除します。よろしいですか?", vbYesNo) = vbYes Then Sheets("リスト").Select i = 5 Do Until i = 200 If Cells(i, 5).Value = Sheets("マスタ登録").Range("D5") Then Cells(i, 1).EntireRow.Delete End If i = i + 1 Loop Else Exit Sub End If End Sub

  • エクセルVBAの繰り返し処理の質問

    C列にある項目とG列にある項目を比較して、 一致し、H列にある数字が10以上ならば、B列にフラグ1を立てる という処理を行いたいんですが、 下記ぐらいまでしか作れず、うまくいきません・・・ Sub フラグを立てる処理() Dim i As Integer Dim j As Integer Dim k As Integer i = 1 j = 1 Do j = j + 1 Do i = i + 1 If Cells(j, 8) > 9 Then Cells(i - 1, 4) = 1 End If Loop Until Cells(i, 3) <> Cells(j, 7) Or Cells(i, 3) = "" Loop Until Cells(j, 7) = "" End Sub わかる方がいらっしゃいましたら、お願いします。

  • 【エクセルVBA】特定のシートのみ検索したい

    VBA勉強中です。 フォルダにある複数のファイル(1ファイル内には複数シートあります)を順番に開けて検索をかけ、条件に合致した行をあるファイルへ転記・集約させるマクロを組みたいと思っています。 (条件は1番左の列が「○」であることです。) ネットや本を参考にしながら組んでみたのですが、「○」がない(シートの)行も転記されてしまい困っています。 (○があるシートは複数シートの内、1シートのみなのですが、○がないシートからも 「○があるシートの○がある行」と同じ行番号の行がが転記されているようです) 組んでみたマクロは以下のとおりです。 ------------------------------------------------ Sub 楕円1_Click() ActiveSheet.Range("A2:H30").ClearContents Dim ans, fn, wb, x, i, n, sh, myPath ans = "○" '条件 myPath = ThisWorkbook.Path & "\" fn = Dir(myPath & "*.xls") '選択したフォルダ内のExcelファイル Do Until fn = "" If fn <> ThisWorkbook.Name Then 'ファイルが当ファイル以外なら Set wb = Workbooks.Open(myPath & fn) '選択したファイルを開きます For Each sh In wb.Worksheets '各シートごとに x = sh.Cells(Rows.Count, 1).End(xlUp).Row '最終行取得 For i = 1 To x '1行目から最終行まで以下を実行します If Cells(i, 1) = ans Then '条件に合致するか検索 n = n + 1 With ThisWorkbook.Sheets("Sheet1") '転記 .Cells(n + 1, 1) = sh.Cells(i, "B") .Cells(n + 1, 2) = sh.Cells(i, "C") .Cells(n + 1, 3) = sh.Cells(i, "D") .Cells(n + 1, 4) = sh.Cells(i, "E") .Cells(n + 1, 5) = sh.Cells(i, "F") End With End If Next i Next sh wb.Close (False) '選択したファイルを閉じる End If fn = Dir() '次のファイルを検索 Set wb = Nothing Loop '繰り返し --------------------------------------------------------- このマクロでは各ファイルの全てのシートを検索していると思うのですが、 全シートを検索していることが問題でしょうか? 検索したいデータは特定のシートにのみ存在するので(全ファイル同じ名前のシートです) 特定のシートのみ検索してくれればそれで良いのですがどう変更すればよいかわかりません。 「For Each sh In wb.Worksheets '各シートごとに」 色々と調べてここを変更してみたのですが 何れもエラーとなり上手くいきませんでした。 どなたか上手く直す方法を教えて下さい。 宜しくお願いします。

  • エクセルVBAで、分岐がうまくできません。

    A,B,,Cのりんごとみかんの3種類の仕入れパターンがあり仕入の数量を算出したいですが、適正値が算出されません。 どのようにしたら、適正値を算出できるにのか教えてください。 Sub test() Dim i As Integer 'A リンゴは、500以下になったら1000個になるように仕入 'A みかんは、500以下になったら1000個になるように仕入 'A みかんまたはりんごの片方が500以下になったらみかんとりんごを1000個になるように仕入 i = 2 Do While Worksheets("sheet1").Cells(i, 1) <> "" If Cells(i, 1) = "A" And Cells(i, 2) <= 500 Or Cells(i, 3) <= 500 Then Worksheets("sheet1").Cells(i, 4) = 1000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 1000 - Cells(i, 3) 'End If 'i = i + 1 'Loop 'B リンゴは、400以下になったら2000個になるように仕入 'B みかんは、400以下になったら2000個になるように仕入 'A みかんまたはりんごの片方が400以下になったらみかんとりんごを2000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "B" And Cells(i, 2) <= 400 Or Cells(i, 3) <= 400 Then Worksheets("sheet1").Cells(i, 4) = 2000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 2000 - Cells(i, 3) 'End If 'i = i + 1 'Loop ''C リンゴは、300以下になったら3000個になるように仕入 ''C みかんは、300以下になったら3000個になるように仕入 'A みかんまたはりんごの片方が300以下になったらみかんとりんごを3000個になるように仕入 i = 2 'Do While Worksheets("sheet1").Cells(i, 1) <> "" ElseIf Cells(i, 1) = "C" And Cells(i, 2) <= 300 Or Cells(i, 3) <= 300 Then Worksheets("sheet1").Cells(i, 4) = 3000 - Cells(i, 2) Worksheets("sheet1").Cells(i, 5) = 3000 - Cells(i, 3) End If i = i + 1 Loop End Sub

  • Excel VBA セルの指定の方法

    VBAの初心者です。処理1 のサブルーチンを使わずに直接記述すれば、エラーはでませんが、以下のように記述すればエラーが出てしまいます。宜しくお願いします。 Sub Macro10() i = 1 Do Until Cells(i, 1) = "" 処理1 i = i + 1 Loop End Sub Sub 処理1() Cells(i, 2).Select  ← ここでエラーになります。        ActiveCell.FormulaR1C1 = "◎" End Sub

  • エクセルVBAについて

    エクセルVBA初心者です。 左の表からある一定以上の売上を得た人を抽出し、右の表に表示したいのですが以下のプログラムだと上手くいきません。 どこがダメなのでしょうか? Private Sub cmdUriken_Click() Dim k As Integer Dim l As Integer Dim m As Integer k = 2 l = 2 m = 2 Do Until Cells(m, 32) = "" Range(Cells(m, 19), Cells(m, 34)).Select Selection.ClearContents m = m + 1 Loop Do Until Cells(k, 14) = "" If Cells(k, 14) >= txtUriken.Text Then Range(Cells(k, 1), Cells(k, 16)).Select Selection.Copy Range(Cells(l, 19), Cells(l, 34)).Select ActiveSheet.Paste l = l + 1 Application.CutCopyMode = False End If k = k + 1 Loop End Sub ちなみに If Cells(k, 14) = txtUriken.Text Then とするとちゃんと同等の売上が表示されるので >= の使い方が間違っていると思うのですが よろしくお願いします。

  • VBAの定義と印刷について

    VBAで下記の様に定義をして印刷していますが、sheet"AAA","BBB"と同じく 新しいsheet"DDD"もの一緒に印刷したい場合の定義はどうなるのでしょう!教えて頂けますでしょうか。 よろしくお願いします。 別sheetの"sheet1"A列 AAA,BBB,CCC          B列 1,2,3  として印刷フラッグがある。 VBAでは Sub sheet1印刷() CNT = 4 CNT1 = 1 CNT2 = 1 TAKE = 0 CK = 30 Do Until CNT2 = CNT Do Until CNT1 = 4 If Sheets("sheet1").Cells(CNT1, 1) = Sheets("sheet1").Cells(CNT2, 3) Then TAKE = Sheets("sheet1").Cells(CNT1, 2) Select Case TAKE Case 1: Sheets("AAA").PrintOut Copies:=1 Case 2: Sheets("BBB").PrintOut Copies:=1 Case 3: Sheets("CCC").PrintOut Copies:=1 End Select CNT1 = 1 Exit Do Else: CNT1 = CNT1 + 1 End If Loop CNT2 = CNT2 + 1 Loop End Sub

  • エクセルVBAで無限ループ

    教えてください。 以下の2つのエクセルマクロはまったく同じことをさせようとしているのですが、test02の方は.Offset(1).Activateが働かないのか、無限ループに陥ってしまいます。 単にActiveCell.という記述をWith~End Withでまとめただけなのになぜこうなるのでしょうか? Sub test01() ActiveSheet.Cells(1, 1).Activate Do While ActiveCell.Value <> "" If Not IsNumeric(ActiveCell.Value) Then ActiveCell.Offset(0, 1).Value = "文字" ElseIf ActiveCell.Value > 0 Then ActiveCell.Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then ActiveCell.Offset(0, 1).Value = "負数" Else ActiveCell.Offset(0, 1).Value = "その他" End If ActiveCell.Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End Sub Sub test02() ActiveSheet.Cells(1, 1).Activate With ActiveCell Do While .Value <> "" If Not IsNumeric(.Value) Then .Offset(0, 1).Value = "文字" ElseIf .Value > 0 Then .Offset(0, 1).Value = "正数" ElseIf ActiveCell.Value < 0 Then .Offset(0, 1).Value = "負数" Else .Offset(0, 1).Value = "その他" End If .Offset(1).Activate i = i + 1 Application.StatusBar = i Loop End With End Sub

専門家に質問してみよう