いつもお世話になっております。
ちょっと前に、こちらで「別シートにデータをコピーするマクロ」
http://bit.ly/1RQlK8M
という質問で、親切な方にサンプルのマクロを頂きました。
解答して頂いた方、ありがとうございます。
仕事で使うので、早速、使ってみたところ、
現場からカスタムのリクエストが来ました。
一見、簡単そうなカスタムなのですが、、、
今の私の知識では手に負えません。
「Sheet1」に入っているデータをコピーして「Sheet2」に
画像のようにタテ1列に張り付けるというマクロです。
前回とよく似ているのですが、今度は「Sheet2」にタテ方向に貼付ける時の順番
(「Sheet1」を読込む時の順番?)が異なります。
すいませんが、詳しい方、親切な方、前回同様、サンプルのマクロを
貼り付けて頂けないでしょうか?
よろしくお願いします。
※必要としている機能は「Sheet1」、「Sheet2」の画像でわかると思います
※前回のサンプルのマクロは http://bit.ly/1RQlK8M にあります。
※前回記載した通り、まだVBA初心者です。理論を説明して頂いても理解出来ないと思います。
すいませんがサンプルの貼り付けでお願いします。
EXCELのバージョンはEXCEL2010です。
No.3ベストアンサー
- 回答日時:
>A1セルに「伝票番号」と記入したいです。
要するに行番号の始まりが何行目か?だけのもんだいです。
最初の「Sample1」のコードに少し手を加えています。
Sub Sample4()
Dim i As Long, j As Long, cnt As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Range("A:A").ClearContents '←Sheet2のA列データを一旦消去//
wS.Range("A1") = "伝票番号" 'A1セルも消去しているので「伝票番号」を入力//★
cnt = cnt + 1 '←ここで行番号を「1」に設定しておく//★
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row '←2行目~A列最終行まで//
For j = 2 To 11 '←B列~K列まで//
If .Cells(i, j) <> "" Then
cnt = cnt + 1 '←行番号を「1」ずつプラスするので最初は「2」となる//★
wS.Cells(cnt, "A") = .Cells(i, j) '←Sheet2A列「i」行目にSheet1の「i」行「j」列データを代入//★
End If
Next j
Next i
End With
End Sub
※ 最初の質問が1行目からの表示だったのであのようにしましたが、
1行目に何らかのデータがあるのであれば↓のコードでも大丈夫だと思います。
Sub Sample5()
Dim i As Long, j As Long, wS As Worksheet
Set wS = Worksheets("Sheet2")
wS.Range("A:A").ClearContents
wS.Range("A1") = "伝票番号"
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
For j = 2 To 11
If .Cells(i, j) <> "" Then
wS.Cells(Rows.Count, "A").End(xlUp).Offset(1) = .Cells(i, j)
End If
Next j
Next i
End With
End Sub
あらためて、ご解答ありがとうございます。
Sample4と Sample5ですが、変数の数が違うのですね。
今の私には 変数が1個少ないSample5の方がわかりやすいので、
今回はSample5の方を使わせて頂きます。
注意深く読み返して、とりあえずわかるところから
つぶしていくと、、、。
cnt As Long, cntは長整数型の変数
cnt = cnt + 1 '1行づつ足していく=1行づつ下に行く
ということで、Offset(1)と同じですね。
ちなみに、
cnt = cnt + 1 '←行番号を「1」ずつプラスするので最初は「2」となる//★
で、1回目の cnt = cnt + 1 に対して下に1行下げているわけですね。
詳しい説明ありがとうございます。
-------------
前回同様、補足コメントのところに
最後の質問を入力しておきます。
ありがとうございました。
No.4
- 回答日時:
質問3については、今までの流れとは全く関係ないのですね?
まぁ~~~それはさておいて・・・
当方がアドバイスできる範囲内でお答えします。
1)~5)に関してですが、メッセージボックスよりもインプットボックスの方が適していると思いますが、
フォントサイズ等の変更ができるかどうか判りません。
自分だと↓の画像のようなテキストボックスとコマンドボタンを配置したユーザーフォームを作成し、
質問にある方法にします。
(ユーザーフォーム作成時にプロパティでフォントサイズ等が設定できるため)
その下準備ができた上での一例です。
まずSheet上にコマンドボタンを配置、コマンドボタンのコードを↓にします。
Private Sub CommandButton1_Click()
UserForm1.Show
End Sub
次にユーザーフォームのコマンドボタンのコードを↓にします。
Private Sub CommandButton1_Click()
Dim str As String, c As Range
If TextBox1 <> "" Then
str = TextBox1
Set c = ActiveSheet.Cells.Find(what:=str, LookIn:=xlValues, lookat:=xlWhole)
Unload Me
If Not c Is Nothing Then
c.Select
Else
MsgBox "該当データなし"
End If
Else
MsgBox "入力してください"
End If
End Sub
これで何とかお望み通りの動きになると思います。
※ 入力時のフォントサイズにこだわらないのであれば
インプットボックスを使用して、Sheet上のコマンドボタンをクリックで
何とかできると思います。m(_ _)m
ご解答ありがとうございます。
昨夜やってみましたが、今の僕では知識不足でわかりませんでした。
アドバイスして頂いことは適切だと思います。
今の僕にインプットボックスの知識が全くないので、
この件は、勉強してから改めて相談させて頂きます。
なので、今回は、ここで区切って質問を閉じさせて頂きます。
ーーーーーーーーーーーーーーーーー
今回は知識不足の僕にいろいろアドバイスを頂き
本当にありがとうございます。
遠くないうちに、この件も含め、またこちらで質問を投稿します。
その際は、またよろしくお願いします。
今回は本当にありがとうございました。
PS
質問3については、今までの流れとは全く関係ないのですね?
まぁ~~~それはさておいて・・・
おっしゃるとおりです。
頂いたソースコードは現場でそのまま利用しています。
現場が急に「検索できるようにして欲しい」というので、
今回、質問3で検索の話になりました。
本当は「Sheet1」から「Sheet2」にコピーするときの
レイアウトに関する質問の予定でした。
ということで検索窓の勉強をしておきます(笑)
今回は本当にありがとうございます。
はてな ペントス
No.2
- 回答日時:
続けてお邪魔します。
>「For j = 2 To 11」 '←B列~K列まで//
とありますので、B列を「B2からB31まで読み込む」と思っていました。
コード内で
>wS.Cells(cnt, "A") = .Cells(i, j)
のように変数「j」は列番号として使用していますので、
>For j = 2 To 11
は
2列目~11列目 すなわち B列~K列まで
というコトになります。
>For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
>For j = 2 To 11
の変数のループを見ると「i」の方が先に来ていますので、
2行目の2列目~11列目 → 3行目の2列目~11列目 → 4行目の2列目~11列目・・・
各行を右に向かってループするコードになります。
※ 余談ですが
>For j = 2 To 11
>For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
のように入れ替わると
B列の2行目~最終行まで → C列の2行目~最終行まで・・・
といった具合に下方向にループするコトになります。m(_ _)m
早速のご回答ありがとうございます。
>For j = 2 To 11
は2列目~11列目 すなわち B列~K列まで
というコトになります。
ここまでは問題ないです。
>For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
>For j = 2 To 11
の変数のループを見ると「i」の方が先に来ていますので、
2行目の2列目~11列目 → 3行目の2列目~11列目 → 4行目の2列目~11列目・・・
各行を右に向かってループするコードになります。
問題はこちらでした。
アドバイスを注意深く読んで、、、、最後に気が付いたのですが、
「.End(xlUp).Row」とあります。
「Row」は「行」ですから、始めから横向きということですね。
こちらの注意不足でした。
↑ちなみにタテなら「.End(xlUp).Column」でいいんでしょうか?
※ 余談ですが
>For j = 2 To 11
>For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row
のように入れ替わると
B列の2行目~最終行まで → C列の2行目~最終行まで・・・
といった具合に下方向にループするコトになります。m(_ _)m
ということですね。
丁寧なご説明、本当にありがとうございます。
ーーーーーーーーー
前回同様、補足コメントのところに
2個目の質問を貼り付けておきます。
1問づつ聞いていきますので、まだ質問3があります。
なので余裕のある時でOKですので、ご返答して頂けましたら、
ありがたいです。
本当にありがとうございます。
No.1
- 回答日時:
こんばんは!
今回は単純に縦に並べていけば良いのですね?
そうであれば前回の Sample1 のマクロで大丈夫だと思います。
(Sample1を行った後で昇順に並び替えたのがSample2です。)
※ 前回はK列まで限定でした。
列数は関係なく、各行の最終列まで!というコトであれば
↓のコードにしてみてください。
(前回のSample1に少しだけ手を加えています)
Sub Sample3()
Dim i As Long, j As Long, cnt As Long, wS As Worksheet
Dim lastCol As Long '←変数を追加//★
Set wS = Worksheets("Sheet2")
wS.Range("A:A").ClearContents '←Sheet2のA列データを一旦消去//
With Worksheets("Sheet1")
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row '←2行目~A列最終行まで//
lastCol = .Cells(i, Columns.Count).End(xlToLeft).Column '← 「i」行の最終列を取得//★
If lastCol > 1 Then
For j = 2 To lastCol '←B列~データがある最終列まで//★
cnt = cnt + 1
wS.Cells(cnt, "A") = .Cells(i, j)
Next j
End If
Next i
End With
End Sub
こんな感じではどうでしょうか?m(_ _)m
いつもありがとうございます
ご指摘の通り、前回のもので機能しました。
勘違いした理由は、前回のサンプルでは「伝票番号」の
名前がランダムで適当な名前をつけたため気が付きませんでした。
※現場の名前もランダムなので思い違いをしたのだと思います。
今回のサンプルは順番がわかりやすいように「伝票番号」の名前を
AとBにわけて番号順にしたのでご指摘に気が付きました。
本当にいつもシンプルで丁寧なご説明ありがとうございます。
で、、、実はこの件に関して、あと3個、質問したいことがあり、
説明の上手なtom04さんを待っていました。
なので、いきなりベストアンサーですが、
あと3個、わかりやすい質問、説明のために準備するので、
ちょっと待って下さい。
取り急ぎ、お礼を入力させて頂きました。
本当にありがとうございます。
※なので質問は閉じないで開けておきますね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCEL マクロで 同じフォルダ内の複数ファイルの複数行全体を選択して1つのファイルに集約 4 2022/09/27 18:41
- Excel(エクセル) Excel使用前提 同じフォルダ内にあるファイルの集約等をマクロでできますか 4 2022/09/06 19:03
- Excel(エクセル) Excelの複数ファイルの複数行を別ファイル1つのシートにVBA、マクロで集約する方法 5 2022/09/13 06:30
- Excel(エクセル) Excel、同じフォルダ内のExcelファイルの特定シートのみを1つのファイルに集約したい 8 2022/09/07 15:12
- Visual Basic(VBA) 【困っています2】VBA 追加処理の記述を教えてください。 2 2022/08/26 11:42
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/07/04 17:58
- Excel(エクセル) エクセルのマクロでコピー後の貼り付け先を毎回指定したところにしたい 5 2022/08/12 10:47
- Visual Basic(VBA) VBAマクロ 決まっていない行を選択して別シートへ貼付け 4 2023/02/16 16:08
- Excel(エクセル) エクセルのマクロについて教えてください。 1 2023/02/25 11:55
- Excel(エクセル) エクセルのマクロについて教えてください。 3 2023/02/07 14:47
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
「段」と「行」の違いがよくわ...
-
エクセル 重複 隣の列 一番...
-
VLOOKUPの列番号の最大は?
-
VBA 指定した列にある日時デー...
-
エクセルマクロの組み方
-
エクセルで複数列の検索をマク...
-
エクセル マクロ 範囲指定で...
-
Excel 区切り位置指定ウィザー...
-
アクセス 取り込み時に、桁数(...
-
Alt+Shift+↑を一括で行うには、...
-
LEFT関数とIF関数の組み合わせ...
-
土日の列幅の自動変更を教えて...
-
CSVファイルの「0落ち」にVBA
-
えABのある列って
-
ListViewで列を指定して表示さ...
-
EXCELの「行列を入れ替える」マ...
-
エクセルで最初の行や列を開け...
-
Excelの行数、列数を増やしたい...
-
Excel文字列一括変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで離れた列を選択して...
-
VLOOKUPの列番号の最大は?
-
「段」と「行」の違いがよくわ...
-
LEFT関数とIF関数の組み合わせ...
-
VBA 指定した列にある日時デー...
-
CSVファイルの「0落ち」にVBA
-
エクセルで複数列の検索をマク...
-
Excelの行数、列数を増やしたい...
-
エクセルマクロの組み方
-
エクセルマクロPrivate Subを複...
-
リストからデータを紐付けしたい
-
エクセルのソートで、数字より...
-
エクセルで住所を県と市・郡と...
-
VBAで別ブックの列を検索し、該...
-
Excel文字列一括変換
-
VBA
-
エクセル 重複 隣の列 一番...
-
列方向、行方向の定義
-
Alt+Shift+↑を一括で行うには、...
-
VBAで結合セルを転記する法を教...
おすすめ情報
「Sheet2」の画像はこちらです。
要するに、「Sheet1」で「伝票番号1」~伝票番号の記入のあるところまでコピーして、
それを入力された順番通り「Sheet2」で上からタテに貼り付ける、という機能が必要です。
入力時は以下のルールで入力しています
※入力する順番は左から=「伝票番号1」、「伝票番号2」、「伝票番号3」~
↑入力時は左詰で空白セルなし
tom04さんへ
質問1
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row '←2行目~A列最終行まで//
For j = 2 To 11 '←B列~K列まで//
とあります。
この意味って、説明にある通り「A列の2行目から最終行まで(この場合、A32)で最終の
場所を把握する」ってことだと思います。
問題は次で、
「For j = 2 To 11」 '←B列~K列まで//
とありますので、B列を「B2からB31まで読み込む」と思っていました。
その続きで、C2~C33まで読み込むと思っていました。
これって違うのでしょうか?
追記
質問あと2個は明日以降、またアップします。
Tom04さんの他の方も詳しい方、説明の上手な方、
よろしくお願いします。
tom04さんへ
質問2
図のように「Sheet2」の貼り付け場所を一行ずらして、
A1セルに「伝票番号」と記入したいです。
当初、「これくらい自力でカスタマイズ出来る」と思っていました。
私は以下のように、「Range("A2").Select」で、
カーソルを移動させれば、そこから先に貼り付けて行くと思っていました。
For i = 2 To .Cells(Rows.Count, "A").End(xlUp).Row '←2行目~A列最終行まで//
For j = 2 To 11 '←B列~K列まで//
If .Cells(i, j) <> "" Then
Range("A2").Select
cnt = cnt + 1
wS.Cells(cnt, "A") = .Cells(i, j)
この程度のことで、申し訳ないのですが、
よろしくお願いします。
tom04さん
ご解答ありがとうございます。
あらためて自分で理解してから最後の質問する予定です。
※お礼に入力すると次回のリプライメールが送信されないと思いますので、
質問3の時にあらためてお礼させて頂きます。
今回は取り急ぎ、こちらで、、、ありがとうございます。
tom04さんへ
質問3 メッセージボックスを利用してシート内の検索をしたい
メッセージボックスを利用して検索することは出来ますか?
希望する機能は以下の通りです。
1)マクロのボタンをクリック
2)メッセージボックスが表示される
3)メッセージボックスの中に文字列を入力する
4)メッセージボックスの「OK」をクリックする
5)カーソルが入力した文字列と同じ値のセルに移動する
※入力した文字列がワークシート上にない場合は
「入力された文字はありません」と表示される
※「マクロ用のボタン」は自力で作成、マクロの登録が出来ます。
なのでボタンの作成については説明不要です。
※入力する文字を大きくしたい
→フォントサイズ=18くらいで、太字(ボールド)にしたいです。
→こういう機能がない場合、検索の件だけでもOKです。
よろしくお願いします
今回はいろいろありがとうございます