アプリ版:「スタンプのみでお礼する」機能のリリースについて

いつもお世話になっております。

ちょっと前に、こちらで「別シートにデータをコピーするマクロ」
http://bit.ly/1RQlK8M 

という質問で、親切な方にサンプルのマクロを頂きました。
解答して頂いた方、ありがとうございます。

仕事で使うので、早速、使ってみたところ、
現場からカスタムのリクエストが来ました。

一見、簡単そうなカスタムなのですが、、、
今の私の知識では手に負えません。

「Sheet1」に入っているデータをコピーして「Sheet2」に
画像のようにタテ1列に張り付けるというマクロです。

前回とよく似ているのですが、今度は「Sheet2」にタテ方向に貼付ける時の順番
(「Sheet1」を読込む時の順番?)が異なります。

すいませんが、詳しい方、親切な方、前回同様、サンプルのマクロを
貼り付けて頂けないでしょうか?

よろしくお願いします。

※必要としている機能は「Sheet1」、「Sheet2」の画像でわかると思います

※前回のサンプルのマクロは http://bit.ly/1RQlK8M にあります。

※前回記載した通り、まだVBA初心者です。理論を説明して頂いても理解出来ないと思います。
すいませんがサンプルの貼り付けでお願いします。

EXCELのバージョンはEXCEL2010です。

「「コピー → 行列を入れ替えて貼付け」み」の質問画像

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

  • 「Sheet2」の画像はこちらです。

    要するに、「Sheet1」で「伝票番号1」~伝票番号の記入のあるところまでコピーして、
    それを入力された順番通り「Sheet2」で上からタテに貼り付ける、という機能が必要です。

    入力時は以下のルールで入力しています
    ※入力する順番は左から=「伝票番号1」、「伝票番号2」、「伝票番号3」~
    ↑入力時は左詰で空白セルなし

    「「コピー → 行列を入れ替えて貼付け」み」の補足画像1
      補足日時:2016/06/03 20:39
  • 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さんの他の方も詳しい方、説明の上手な方、
    よろしくお願いします。

      補足日時:2016/06/03 23:45
  • うーん・・・

    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)

    この程度のことで、申し訳ないのですが、
    よろしくお願いします。

    「「コピー → 行列を入れ替えて貼付け」み」の補足画像3
      補足日時:2016/06/04 22:55
  • HAPPY

    tom04さん

    ご解答ありがとうございます。
    あらためて自分で理解してから最後の質問する予定です。

    ※お礼に入力すると次回のリプライメールが送信されないと思いますので、
    質問3の時にあらためてお礼させて頂きます。

    今回は取り急ぎ、こちらで、、、ありがとうございます。

      補足日時:2016/06/06 12:36
  • どう思う?

    tom04さんへ

    質問3 メッセージボックスを利用してシート内の検索をしたい

    メッセージボックスを利用して検索することは出来ますか?
    希望する機能は以下の通りです。

    1)マクロのボタンをクリック 
    2)メッセージボックスが表示される
    3)メッセージボックスの中に文字列を入力する
    4)メッセージボックスの「OK」をクリックする
    5)カーソルが入力した文字列と同じ値のセルに移動する

    ※入力した文字列がワークシート上にない場合は
     「入力された文字はありません」と表示される

    ※「マクロ用のボタン」は自力で作成、マクロの登録が出来ます。
    なのでボタンの作成については説明不要です。

    ※入力する文字を大きくしたい
    →フォントサイズ=18くらいで、太字(ボールド)にしたいです。
    →こういう機能がない場合、検索の件だけでもOKです。

    よろしくお願いします
    今回はいろいろありがとうございます

      補足日時:2016/06/07 00:07

A 回答 (4件)

>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
    • good
    • 1
この回答へのお礼

あらためて、ご解答ありがとうございます。

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行下げているわけですね。

詳しい説明ありがとうございます。
-------------

前回同様、補足コメントのところに
最後の質問を入力しておきます。

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

お礼日時:2016/06/06 23:51

質問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
「「コピー → 行列を入れ替えて貼付け」み」の回答画像4
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。

昨夜やってみましたが、今の僕では知識不足でわかりませんでした。
アドバイスして頂いことは適切だと思います。

今の僕にインプットボックスの知識が全くないので、
この件は、勉強してから改めて相談させて頂きます。

なので、今回は、ここで区切って質問を閉じさせて頂きます。

ーーーーーーーーーーーーーーーーー

今回は知識不足の僕にいろいろアドバイスを頂き
本当にありがとうございます。

遠くないうちに、この件も含め、またこちらで質問を投稿します。

その際は、またよろしくお願いします。
今回は本当にありがとうございました。


PS
質問3については、今までの流れとは全く関係ないのですね?
まぁ~~~それはさておいて・・・

おっしゃるとおりです。

頂いたソースコードは現場でそのまま利用しています。
現場が急に「検索できるようにして欲しい」というので、
今回、質問3で検索の話になりました。

本当は「Sheet1」から「Sheet2」にコピーするときの
レイアウトに関する質問の予定でした。

ということで検索窓の勉強をしておきます(笑)
今回は本当にありがとうございます。


はてな ペントス

お礼日時:2016/06/08 12:24

続けてお邪魔します。



>「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
    • good
    • 1
この回答へのお礼

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

>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ですので、ご返答して頂けましたら、
ありがたいです。

本当にありがとうございます。

お礼日時:2016/06/04 22:49

こんばんは!



今回は単純に縦に並べていけば良いのですね?
そうであれば前回の 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
    • good
    • 1
この回答へのお礼

いつもありがとうございます

ご指摘の通り、前回のもので機能しました。

勘違いした理由は、前回のサンプルでは「伝票番号」の
名前がランダムで適当な名前をつけたため気が付きませんでした。
※現場の名前もランダムなので思い違いをしたのだと思います。

今回のサンプルは順番がわかりやすいように「伝票番号」の名前を
AとBにわけて番号順にしたのでご指摘に気が付きました。

本当にいつもシンプルで丁寧なご説明ありがとうございます。

で、、、実はこの件に関して、あと3個、質問したいことがあり、
説明の上手なtom04さんを待っていました。

なので、いきなりベストアンサーですが、
あと3個、わかりやすい質問、説明のために準備するので、
ちょっと待って下さい。

取り急ぎ、お礼を入力させて頂きました。
本当にありがとうございます。

※なので質問は閉じないで開けておきますね。

お礼日時:2016/06/03 22:44

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