プロが教える店舗&オフィスのセキュリティ対策術

https://oshiete.goo.ne.jp/qa/9671375.html
前回の引き続きです。
よろしくお願いします。

ボタンマクロの名前です。
xlsb'!ボタン2_Click でした。

前回は質問の補足が不足してしまい焦ってしまって、一気に沢山質問してしまい…
混乱してしまいました。1個づつ落ち着いて取り組んでいこうと思います。
よろしくお願いします。
増え続けていくデータの領域指定について、ご教授お願いします。
名前の定義の範囲指定について
シート名は 管理表 です。
AからZ列まであって、
行については増え続けていきます。増えていく行を確認するのは、A列です。
項目名の記載のあるのは、A6です。
データを入力するのは、A7から取りあえず、Z7までにしたいです。
データはこれから増え続ける予定です。

補足として、画像を別添しました。

「エクセルVBA 一つ上の行を指定した回数」の質問画像

質問者からの補足コメント

  • よく考えたら、この質問には名前の定義は不要なんですよね。
    すみませんでした。
    これが解決したら、名前の定義について、ゆっくり考えて行きたいと思います。

      補足日時:2017/03/17 17:28
  • 前回のスレッドの質問で、オートフィルターの検索マクロを教えていただいていたのを思い出しました。
    コピペで、ワークシート名を入れたのですが、エラーになってしまいました。
    ご教授お願いします。

    「エクセルVBA 一つ上の行を指定した回数」の補足画像2
      補足日時:2017/03/17 17:46
  • >次に表示されているVBE画面の左側に「Sheet1(管理表)」と表示されていると思いますので
    そこをダブルクリック → 表示されたVBE画面のカーソルが点滅しているところに
    ↓のコードをコピー&ペースト

    この部分、見つけました。
    ありがとうございました。
    実行したところ、データが全て消えてしまいました。
    私の貼り付けがまずかったのでしょうか?

    「エクセルVBA 一つ上の行を指定した回数」の補足画像3
    No.4の回答に寄せられた補足コメントです。 補足日時:2017/03/17 20:47
  • 助けてください(汗)
    Qの列のコピーや削除をしたら、エクセルが応答無くなってしまって、困っています。
    3/16のスレッドに戻って、何度もトライしているのですが、結果は同じで。
    せっかく上手くモジュールが作動して、喜んでいたのに・・・
    どうしたらよいのでしょうか?
    とても困っています。

    「エクセルVBA 一つ上の行を指定した回数」の補足画像4
      補足日時:2017/03/17 23:27
  • 一行づつ茶色に反転させて試してみました。
    添付の通り、一行目から黄色くなってしまいました。

    「エクセルVBA 一つ上の行を指定した回数」の補足画像5
      補足日時:2017/03/18 00:34
  • 全部反転して試しました。
    画像添付します。

    「エクセルVBA 一つ上の行を指定した回数」の補足画像6
      補足日時:2017/03/18 00:40

A 回答 (16件中1~10件)

名前の定義ですが前回のスレッドでは


=OFFSET(管理表!A7,0,0,COUNTA(A:A)-1,18)
としていましたよね。
18が横の数なので26に変えたらZ列までになります。
A列の文字を数えているのでA6の項目の分1引いているのが
この式になります。
ひとつ心配なのはボタンに隠れるA1:A5に
なにか誤って文字が入るとずれることですが
ま、それは注意すれば大丈夫でしょう。
大事な事忘れてました。絶対指定が抜けてましたね。
これじゃ入力するセルによって範囲がずれてしまいます。

ですから式はこんな感じかな。
=OFFSET(管理表!$A$7,0,0,COUNTA($A:$A)-1,26)

ただ僕の場合こういった表は$A$6始まりにします。
項目名とかも拾えるから。
ま、そこは好みですが。
    • good
    • 0
この回答へのお礼

ありがとうございました。
早速、今まで入力した分の名前の定義を絶対指定にします。
A6始まりですね。こちらも早速直しておこうかと思います。

お礼日時:2017/03/17 17:57

まずさあ、


sub ほにゃらか()      ’ほにゃらかはあなたがつけたいSub名を自由に
ここに記述しないと!!
End sub

どうやって今まで試してたの?


Worksheets("Sheet1”)に変えてもいいって書きましたよね。
Worksheets("管理表”). て、なってないんじゃない?

それとあくまでもそれは入れ物で中身はまだ書いてないからね。
絞り込んでるかいないかをそうやって判断できるから
それぞれの場合でかき分けたらいいかなというもの。
    • good
    • 0
この回答へのお礼

いつもありがとうございます。
今日は過去のスレッドを再確認しながら、オートフィルター部分を再勉強してます。
わからない事ばかりで、何度も質問してしまって、申し訳ない気持ちでいっぱいです。
ついていけるように頑張りますので、またご教授お願いします。

お礼日時:2017/03/17 22:30

こんばんは!



横からお邪魔します。
質問内容を拝見するとわざわざ「コマンドボタン?」を使わなくてもChangeイベントで良いのでは?

あくまで一例です。
まず↓のコードを標準モジュールにしてください。

Sub Sample1() 'この行から//
Dim lastRow1 As Long, lastRow2 As Long, lastCol As Long, wS As Worksheet
Set wS = Worksheets("Sheet2") '//「Sheet2」は実際のシート名に!//
With Worksheets("Sheet1") '//「Sheet1」も実際のシート名に!//
lastRow1 = .Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(6, Columns.Count).End(xlToLeft).Column
lastRow2 = wS.Cells(Rows.Count, "A").End(xlUp).Row
If lastRow2 > 5 Then
Range(wS.Cells(6, "A"), wS.Cells(lastRow2, lastCol)).Clear
End If
.Range("A6").AutoFilter field:=1, Criteria1:=.Range("A1")
If .Cells(Rows.Count, "A").End(xlUp).Row > 6 Then
Range(.Cells(6, "A"), .Cells(lastRow1, lastCol)).SpecialCells(xlCellTypeVisible).Copy wS.Range("A6")
.AutoFilterMode = False
Else
.AutoFilterMode = False
MsgBox "該当データなし"
End If
End With
End Sub 'この行まで//

次に↓のコードを元データ(Sheet1)のシートモジュールにしてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target <> "" And Target.Address = "$A$1" Then
Call Sample1
End If
End Sub

これでSheet1のA1セルが変更のたびに
Sheet2のA6以降にデータが表示されると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
A1セルに表示しただけで出来るんですね…
ご教授お願いします。

sheet1の名前が 管理表 です。
検索結果を表示したいのも、sheet1のA1のセルだった場合はどうしたらよいのでしょうか?
検索範囲はsheet1のA6からZにデーターを入れます。
行数はどんどん増える予定です。

恥ずかしながら…VBA初心者ですので、そのままコピペさせていただければ嬉しいです。

お礼日時:2017/03/17 19:08

No.3です。



>sheet1の名前が 管理表 です。
>検索結果を表示したいのも、sheet1のA1のセルだった場合はどうしたらよいのでしょうか?

まず、Alt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト

Sub Sample1() 'この行から//
Dim lastRow As Long, lastCol As Long, wS As Worksheet
Set wS = Worksheets("Sheet2") '//「Sheet2」は実際のシート名に!//
With Worksheets("管理表") '//←シート名を変更★//
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
lastCol = .Cells(6, Columns.Count).End(xlToLeft).Column
wS.Cells.Clear
.Range("A6").AutoFilter field:=1, Criteria1:=.Range("A1")
If .Cells(Rows.Count, "A").End(xlUp).Row > 6 Then
Range(.Cells(6, "A"), .Cells(lastRow, lastCol)).SpecialCells(xlCellTypeVisible).Copy wS.Range("A1")
.AutoFilterMode = False
Else
.AutoFilterMode = False
MsgBox "該当データなし"
End If
End With
End Sub 'この行まで//

次に表示されているVBE画面の左側に「Sheet1(管理表)」と表示されていると思いますので
そこをダブルクリック → 表示されたVBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト

Private Sub Worksheet_Change(ByVal Target As Range)
If Target <> "" And Target.Address = "$A$1" Then
Call Sample1
End If
End Sub

Excel画面を閉じて「管理表」シートのA1セルに検索データを入力してみてください。m(_ _)m
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございました。
無事標準モジュールに貼り付けることが出来ました。
モジュールの画面の左側に「Sheet1(管理表)」と表示されているところはどこでしょうか?

ここの部分が良く割りませんでした。
>次に表示されているVBE画面の左側に「Sheet1(管理表)」と表示されていると思いますので

ご教授お願いします。

お礼日時:2017/03/17 20:28

No.3・4です。



投稿後もう一度読み返してみると・・・

>検索結果を表示したいのも、sheet1のA1のセルだった場合はどうしたらよいのでしょうか?

すなわち元データは「管理表」シートにあり、「Sheet1」に表示したい!というコトですね?

No.4の標準モジュール、コード内の
>Set wS = Worksheets("Sheet2")

>Set wS = Worksheets("Sheet1")
に変更してください。m(_ _)m
    • good
    • 0
この回答へのお礼

ありがとうございます。
変更してみます。

お礼日時:2017/03/17 20:33

続けてお邪魔します。



>ここの部分が良く割りませんでした。
>次に表示されているVBE画面の左側に「Sheet1(管理表)」と表示されていると思いますので

それでは別の方法で・・・
一旦VBE画面を閉じてください。
画面左下にあるシート名「管理表」のシート見出し上で右クリック → コードの表示 → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト

Private Sub Worksheet_Change(ByVal Target As Range)
If Target <> "" And Target.Address = "$A$1" Then
Call Sample1
End If
End Sub

これで上記コードが「管理表」シートのシートモジュールになりましたので
「管理表」シートのA1セルに色々データを入れてみてください。m(_ _)m
    • good
    • 0
この回答へのお礼

親切にご教授頂いて、ありがとうございます。
貼り付けたところ・・・実行時エラー7
          メモリが不足しています。
とのコメントでした。

どうしたらよいのでしょうか?
ご教授お願いします。

お礼日時:2017/03/17 20:51

ん~~~



>私の貼り付けがまずかったのでしょうか?

貼り付け方云々というよりシート名が全く違っていますよね。
画像が小さくて確認できないのですが、
貼り付け先Sheetのシート名は「Sheet1」や「Sheet2」ではなく、「貼り付け?」(?の部分がよく判りません)
というシート名になっていますね。

コード内の「Sheet2」の部分をそのシート名にする必要があります。

※ 今まで説明してきたことは基本的なコトです。
当然のコトですが最初からできる人はいませんが、ある程度基本的なコトが理解できていないと
他人のコードをコピー&ペーストするだけでは、不具合があってもご自身で手直しができません。
当方がココで投稿しているコードがベストとは言えませんので、
最初は無駄なコードがあっても良いと思うので、
まずはご自身でコードを書いてみるコトだと思います。

そうした上ででこちらのようなサイトを利用すれば他の方々からも
色々アドバイスがいただけると思います。m(_ _)m
    • good
    • 0
この回答へのお礼

VBAを始めたばかりで、勉強不足で申し訳ありません。
VBAの本を読みながら、ここで質問させていただきながら、必死で勉強しています。
sheet2は貼り付け用という名前になっていますが、
sheet1の管理表のA1に検索地を設けて、sheet1のA6からZは項目名。
A7からデータがたくさん入っていきます。
こちらの勝手な判断で、sheet2はこの操作には関係ないかと思ってしまって・・・
申し訳ありませんでした。

でも…どうしてもご教授お願いしたいのです。m(__)m

お礼日時:2017/03/17 21:34

それでは最後にコードにコメントを記載しておきます。



まず↓の画像の左側「管理表」シートのシートモジュールに↓のコードをコピー&ペースト

Private Sub Worksheet_Change(ByVal Target As Range)
If Target <> "" And Target.Address = "$A$1" Then
Call Sample1
End If
End Sub

次に標準モジュールに↓のコードをコピー&ペースト

Sub Sample1() 'この行から//
Dim lastRow As Long, lastCol As Long, wS As Worksheet
'//「貼り付け用」シートを「wS」という変数に格納//
Set wS = Worksheets("貼り付け用")
'//「管理表」シートの・・・//
With Worksheets("管理表")
'//最終行を取得//
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
'//6行目で最終列を取得//
lastCol = .Cells(6, Columns.Count).End(xlToLeft).Column
'//「貼り付け用」シートのデータを一旦消去//
wS.Cells.Clear
'//「管理表」シートのA列をA1セルのデータをキーとしてフィルタを掛ける//
.Range("A6").AutoFilter field:=1, Criteria1:=.Range("A1")
'//A1セルのデータがあれば表示されているデータを「貼り付け用」シートのA1に貼り付け//
'//(データがない場合は項目行だけの表示になるので「>6」としている)//
If .Cells(Rows.Count, "A").End(xlUp).Row > 6 Then
Range(.Cells(6, "A"), .Cells(lastRow, lastCol)).SpecialCells(xlCellTypeVisible).Copy wS.Range("A1")
'//オートフィルタを解除//
.AutoFilterMode = False
Else
'//A1セルのデータがない場合、メッセージボックスを表示//
.AutoFilterMode = False
MsgBox "該当データなし"
End If
End With
End Sub 'この行まで//

これで「管理表」シートのA1セルにデータを入力してみてください。

※ こちらで上記のコードでは↓の画像のような感じになります。m(_ _)m
「エクセルVBA 一つ上の行を指定した回数」の回答画像8
    • good
    • 0
この回答へのお礼

出来ました!
ありがとうございました。

お礼日時:2017/03/17 23:33

ちょっと整理しておきますね。



それと僕の話とtomo04さんの話は一緒くたにすると意味不明になるから
ブックは別名でお願いします。

>前回のスレッドの質問で、オートフィルターの検索マクロを

この話しの流れは表示的には管理表でオートフィルターをかけるのと
ほぼ同じデータだと。
ただ表示するのは別のシートのK17:L18で指定したもので
管理表をフィルタリングしたデータを、その別シートに
という話でしたよね。

だからオートフィルターで絞り込んだのを、もう一つのシートに
貼り付ける想定で話しかけてました。
補足の②がその時のことです。
オートフィルターで操作するときに事前に絞り込み状態を知って
処理するのが妥当と考えたのです。

その流れの中で、フィルターの詳細設定に、ちょっと横道それましたが
(というか、そっちが本筋で良かったんじゃないかと思うけど、)
補足②でオートフィルターに戻す話を言われたので・・・
動かすこと自体はどっちでも出来ますよ。

ただ、No1に書いた通りですが、管理表のA1:A5は名前定義に
あたって使わない前提ですから、お忘れなく。
    • good
    • 0
この回答へのお礼

いつも大変お世話になっております。
3/16に教えていただいて、ちゃんと動いていたはずの列Qのセルの内、一つに任意数字を入力したら、A1の重複しているすべての番号にコピーされるというマクロを実行したら、エクセルが応答無くなってしまうようになってしまいました。
成功していた分をコピペで何度もリトライしてもダメでした。

助けてください。
取り急ぎ補足説明に画像を添付します。

お礼日時:2017/03/17 23:17

この質問最初の画面が変だなぁ。


どうしてこうなったのかな?

僕は前のスレッドの最後の補足の画面で処理することを
考えてました。K17:L18に入力したので絞るから
そのシートのコマンドボタンで起動。
勿論オートフィルターは管理表シートですが、
そこは手で操作するわけじゃないと。
表示するのも入力した画面だしね。

それがフィルターの詳細設定なら、管理表シートはデータ置き場
というだけで、名前定義さえ済んでたら、その名前しか使わない
考えでした。
    • good
    • 0
この回答へのお礼

前のシートと違う理由は、質問用で並行して勉強して行こうと思い、新たなブックにコピーして、用語を触ったりして、教えて頂いて成功したのを原本に貼り付けていました。

どころが…私の勉強不足から、3月16日16時に頂いたいた、A列のセルの中身が…例えば、A列に123という数字が5行あったら、A列に123と入力された行にQ列で指定した数字をコピーするという大切なプログラムを教えて頂いたのに…
Q列に数字を入れたり、消したりしたら、エクセルが応答無しになってしまうトラブルが発生してしまいました。
とても大事なプログラムです。
助けてください。お願いします。
本当にごめんなさい。自分で何とかしようと頑張ったんですが…難しくて、手に負えませんでした。
助けてください。
よろしくお願いします。

お礼日時:2017/03/18 00:11

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!