[[20170815232302]] 『複数ブック・シートのある情報を、特定のシートに』(まさこ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『複数ブック・シートのある情報を、特定のシートに列挙』(まさこ)

レイアウトの説明をさせて頂きます。
ブックAのシート2のA1に見出しとして[氏名] B1に見出しとして[コード]が入力されています。
ブックB、C、Dにはレイアウトが同じシートが複数あります。シートの数がバラバラです。それと同時に、レイアウトが全く違うシートもあります。
同じレイアウトにはA2に文字列、違うレイアウトでは空白と前提条件をそろえています。

ブックB、C、Dにあるレイアウトが同じシート
 A   B    C    D   ・・・  
1  
2 文字列
3
4                
5               
6  [コード] [氏名]     ・・・    
7   あ  兵庫太郎       
8   い  和歌山花子      
9   い  三重太郎       

ブックAのシート2
 A     B     
1[氏名] [コード]  
2 兵庫太郎 あ
3 和歌山花子 い
4 三重太郎 い                
5  

単に領域のコピーだけで済むなら、基本的な動作ですよね
→それが出来なかったんです。

実現させたい事として、
ブックB、C、DのそれぞれのシートでA2セルに文字列があった場合は、B7:Dの最終行をコピーして、ブックAのシート2の最終行に貼り付け。
ブックBCDのそれぞれのシートでA2が空白だった場合は処理をしない。
欲を言えば、本当は、ブックBCDの同じレイアウトのシートでも、6行目の氏名・コードの列がずれているシートがあるのです。その場合は氏名とコードを6行目のどの列にあるのか、MATCHにて取得して
コピーして貼り付け出来たら、最高ですが手も足もでません。

検討違いかもしれませんが、笑われるかもしれませんが、私なりに考えてみたコードです。でも、動きません。ここ最近調べながら考えていて、こんな感じしかできません。
Sub TEST()

Dim WBa As Workbook
Set WBa = Workbooks("A.xlsm")
Dim wb1 As Workbook
Dim wb2 As Workbook
Dim wb3 As Workbook
Set wb1 = Workbooks("B.xlsx")
Set wb2 = Workbooks("C.xlsx")
Set wb3 = Workbooks("D.xlsx")
Dim i As Variant
Dim r As Variant
Dim shA As Worksheet

For i = 1 To wb1.Sheets.Count
For r = 7 To Worksheets(i).Cells(Rows.Count, "C").End(xlUp).Row

For Each shA In Wb1.Sheets

            If shA.Range("A2").Value = "" Then
            Else
WBa.Worksheets("シート2").Range(Cells(1, 1).End(xlDown).Row + 1).Value = wb1.Worksheets(i).Range.Cells(r, 3).Value
WBa.Worksheets("シート2").Range(Cells(1, 2).End(xlDown).Row + 1).Value = wb1.Worksheets(i).Range.Cells(r, 4).Value
Next r
Next i
End Sub

まず分からないことは、ブックBCDに対して繰り返し同じ作業をさせる記述です。
シートの数を数えて、最終行をrで取得して、空白の場合はの処理をFor eachにて記述したつもりです。

< 使用 Excel:Excel2010、使用 OS:WindowsXP >


 簡単な部分から順を追って作っていってはどうですか。

 (1)シート間のコピーペイスト (テスト段階)
 (2)1つのブックのすべてのシートを対象に、転記先ブックの特定シートに転記する。
 (3)多数のブックを対象に (2)の処理を行う

 (4)単純なコピーではなく、
    ・氏名、コード等の列をもとめ、
    ・列単位でコピーペイストする
    ように修正する。
 といった順序でトライしてみてはどうでしょうか。

 まずは、下記の前提で (1)にトライしてみてはいかがですか?

 テスト用のブックを作ります。
 ■Sheet1には以下のデータがあるものとします。

     A          B           
 1     
 2  文字列 
 3 
 4 
 5 
 6  [氏名]      [コード]   
 7  兵庫太郎    あ         
 8  和歌山花子  い         
 9  三重太郎    い         
 10   

 ■また、Sheet2には、下記のデータがあるものとします。
    A           B           
 1  [氏名]      [コード]     
 2 

 ■この時、
    Sheet1の 最終行を求めて、以下のようにSheet2にコピーペイストする処理は書けますか?

    A           B           
 1  [氏名]      [コード]     
 2  兵庫太郎    あ 
 3  和歌山花子  い 
 4  三重太郎    い 

(γ) 2017/08/16(水) 05:02


γ様 私のために丁寧な説明ありがとうございます。上記のような簡単な前提のなら、出来そうですが、暫くパソコンを触れないので、返信が遅くなってしまいますことをお許しください。取り急ぎ報告まで
(まさこ) 2017/08/16(水) 07:39

γ様
以下のコードで実現しました!!
Sub TEST1()
    n = Cells(Rows.Count, "A").End(xlUp).Row + 1
    Sheets("sheet1").Range("A7:B9").Copy Destination:=Sheets("sheet2").Range("A" & n)
End Sub
(まさこ) 2017/08/16(水) 12:06

大分良いところまで来ました。
 
 Sub TEST1() 
    n = Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row + 1
    Sheets("sheet1").Range("A7:B9").Copy Destination:=Sheets("sheet2").Range("A" & n)
 End Sub
 ということですかね。
 
 Range("A7:B9")の9のところも同じようにして、自動的に計算できませんか。
 同じようにEnd(xlUp)を使うとよいと思います。

(γ) 2017/08/16(水) 12:27


γ様
シート1のセルを選択した状態ですが、、、なんとかできました
 Sub TEST1()
    n = Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row + 1
    Sheets("sheet1").Range("A7:B" & Range("B" & Rows.Count).End(xlUp).Row).Copy Destination:=Sheets("sheet2").Range("A" & n)
 End Sub

また暫く返信が遅くなりますことお許しください。
(まさこ) 2017/08/16(水) 13:07


 >シート1のセルを選択した状態ですが

 Sub TEST1()
     n = Sheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row + 1
     Sheets("sheet1").Range("A7:B" & Sheets("sheet1").Range("B" & Rows.Count).End(xlUp).Row).Copy Destination:=Sheets("sheet2").Range("A" & n)
 End Sub
 とすると選択状態に依存しないでしょう。

 変数を使って書けばこうなりますか。
 Sub TEST1()
     Dim ws1 As Worksheet
     Dim ws2 As Worksheet

     Set ws1 = Sheets("sheet1")
     Set ws2 = Sheets("sheet2")
     n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
     ws1.Range("A7:B" & ws1.Range("B" & ws1.Rows.Count).End(xlUp).Row).Copy _
         Destination:=ws2.Range("A" & n)
 End Sub

 ws2.Rows.Countのところは、単に Rows.Count でも問題ないと思います。
 指定したシートでも、(指定しなければActiveなSheetが対象となりますが)ActiveSheetでも
 いずれもRows.Countは固定値を返しますので、省略してもエラーになることはないと思います。

 どうぞ、ご自分のペースで取り組んで下さい。
 だれの為でもありませんから。

 なお、セル範囲の方法には、このほかCellsを使う方法もありますが、
 とりあえず慣れているので行きましょう。
(γ) 2017/08/16(水) 13:59

γ様 なるほど、シートを選択に依存せずに書くことと、変数を宣言して書くコードことまでは、すごく理解できました。

現在(2)1つのブックのすべてのシートを対象に、転記先ブックの特定シートに転記する。
→ブックAのすべてのシートを対象に、ブックBの氏名シートに転帰する
に取り組んでいますが、今日はギブアップします。混乱してきました
以下のコードまで、今できました。何かがおかしいのです。
転帰先ブックの氏名シートに書き込めたのですが、ブックAのシート2しか転帰されていませんでした。
途中までのコードです。ヒントください。

 Sub test2()
    Dim wb1 As Workbook
    Dim wb2 As Workbook
    Dim ws1 As Worksheet
    Dim ws2 As Worksheet

Set wb1 = Workbooks("A.xlsm")
Set wb2 = Workbooks("B.xlsx")
Set ws1 = wb1.Worksheets("sheet1")
Set ws2 = wb2.Worksheets("氏名")

        Dim sh As Worksheet
        Dim r As Long
        n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
        For Each sh In wb1.Sheets
        For r = 7 To sh.Cells(Rows.Count, "B").End(xlUp).Row

    sh.Range("A7:B" & ws1.Range("B" & Rows.Count).End(xlUp).Row).Copy _
         Destination:=ws2.Range("A" & n)
         Next r
         Next sh
 End Sub

(まさこ) 2017/08/16(水) 23:12


 動作確認していませんが、以下をヒントにしてください。

 Sub test3()
     Dim wb1 As Workbook
     Dim wb2 As Workbook
     Dim ws1 As Worksheet
     Dim ws2 As Worksheet

     ' 転記元ブック
     Set wb1 = Workbooks("A.xlsm")
     ' 転記先ブック
     Set wb2 = Workbooks("B.xlsx")
     Set ws2 = wb2.Worksheets("氏名")

     Dim sh As Worksheet
     Dim r As Long

     For Each sh In wb1.Sheets
         n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
         sh.Range("A7:B" & sh.Range("B" & Rows.Count).End(xlUp).Row).Copy _
                 Destination:=ws2.Range("A" & n)
     Next sh
 End Sub

 ところで、このマクロはどのブックに置くのですか?
 転記先のブックにおくのでしょうか?

(γ) 2017/08/17(木) 00:00


γ様 
n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1
For Each sh In wb1.Sheets
→ここが逆だったんですね。
ありがとうございます。なぜそうなってしまったかと言えば、ただただ理解不足です。
でもよくよく考えるとfor each - next で繰り返す時に
氏名シートの最終行を取得しなおす必要があったんですね。
すっきりしました。

転記先のブックに置く予定にしています。
(まさこ) 2017/08/17(木) 00:32


(3)多数のブックを対象に (2)の処理を行う
を現在取り組んででおります。

実務上は、3つのファイルだけを扱えたら行いたいことができます。

ブックBの氏名シートにシートモジュールに下記のコードを置くことを考えました。
・氏名シートにブックA、C、Dの複数シートから集計のコードを書いたつもりです。
実行時エラーでインデックスの有効範囲がありませんとでます。

 Sub test3()
     Dim WBb(2) As Workbook
     Set WBb(0) = Workbooks("A.xls")
     Set WBb(1) = Workbooks("C.xls")
     Set WBb(2) = Workbooks("D.xls")

        Dim i As Long
        Dim sh As Worksheet
        For i = 0 To UBound(WBb, 1)
        For Each sh In WBb(i).Sheets
         n = Me.Cells(sh.Rows.Count, "A").End(xlUp).Row + 1
        sh.Range("A7:B" & sh.Range("B" & Rows.Count).End(xlUp).Row).Copy _
                 Destination:=Me.Range("A" & n)
    Next sh
    Next i
 End Sub

またまた、すみませんがよかったらヒントを教えてください。

(まさこ) 2017/08/17(木) 20:49


インデントをしっかり(正確の意味)つけたほうがよいと思います。
また、エラーはどの行で発生しているのかわかりますか?
(γ) 2017/08/17(木) 21:02

γ様
いつもありがとうございます
はい、インデントをつけるように意識します。
エラーの行なのですが、いつもは黄色の行が出てくるのですが、
インデックスの有効範囲が、、、とメッセージがでます。
でも、コードのエラーの行が表示されません。

(まさこ) 2017/08/17(木) 21:35


γ様 すみません、出来てました!!上記のコードで出来てました!!
お手数をおかけしました。動いて嬉しです。

(まさこ) 2017/08/17(木) 22:00


γ様 自分で(いや、助けてもらいましたが)思い描いた通りに、マクロを初めて書くことができました。
お付き合いありがとうございました。
以下がコードです。
 Sub 完成()
     Dim WBb(2) As Workbook
     Set WBb(0) = Workbooks("A.xls")
     Set WBb(1) = Workbooks("C.xls")
     Set WBb(2) = Workbooks("D.xls")

        Dim i As Long
        Dim sh As Worksheet
        For i = 0 To UBound(WBb, 1) '開いてるブックをループ
        For Each sh In WBb(i).Sheets
         n = Me.Cells(sh.Rows.Count, "A").End(xlUp).Row + 1
              If sh.Range("A2").Value = "" Then   'A2が空白の場合は何もしない
                        Else
          c = Application.WorksheetFunction.Match("氏名", sh.Rows(6), 0)  '6行目で氏名を検索

                sh.Range("A7:B" & sh.Range("B" & Rows.Count).Offset(0, c - 1).End(xlUp).Row).Offset(0, c - 1).Copy _
                                  Destination:=Me.Range("A" & n)
   End If
    Next sh
    Next i
 End Sub

色々マクロを実行しながら、修正して調べてたら、出来ました。
おかしな動きはしていないと思うのですが、何かもっといい案というのか、修正した方がよい箇所ありますか?

(まさこ) 2017/08/17(木) 23:40


インデントについては?
わかりにくいと感じませんか。

(マナ) 2017/08/17(木) 23:54


マナ様
確かに見にくいですね。初心者にも至らないくらいで、
エラーばかりでながら、やっと完成しましたので、動いたのがビックリしたくらいなんです。
気にする余裕がなかったです。インデントは、先頭行を揃えることですよね?

(まさこ) 2017/08/18(金) 00:18


 こんばんわ。

 ちょっと個人的な意見ですけど、インデント・変数の宣言・代入などの意味が分からない内は、
 変数の宣言は一番上だけで行なった方が良いと思いますよ。

 ベテランの人達には、それぞれの言い分があると思うので意見しあうつもりはありませんが、
 私は個人的にはどんなにベテランっぽい人が書いたコードでも、宣言文を途中に書いてるのを見て
 見やすいと思った事は一度も無いです。

 ましてや、宣言文や実行文、インデントの意味も分からない状態で、そんな記述したら余計ぐちゃぐちゃで
 非常に見ずらいです。

 Dim i As Long
 こんなのが宣言です。
 Dim以外にもありますけど、それは慣れてきたらおいおい覚えれば良いと思います。

 Set WBb(0) = Workbooks("A.xls")
 此方は変数に値やオブジェクトを代入しています。
 要は実行文です。

 宣言文とは行を開けるなどして区別した方が良いです。
 γさんの提示のコードでは、途中に出てきていても、その上のDim(宣言文)とは1行空いてますよね。
 その辺が分からない内は、Dimなどの宣言文は一番先頭で宣言した方が見やすくて、
 後でご自身で確認する時も分かりやすいと思いますよ。

 インデントは見やすくする為に、For〜Next や If〜End If の間の文を字下げする事です。

 上述したことを加味して整形すると以下のようになります。

 Sub 完成()
    Dim WBb(2) As Workbook
    Dim i As Long
    Dim sh As Worksheet

    Set WBb(0) = Workbooks("A.xls")
    Set WBb(1) = Workbooks("C.xls")
    Set WBb(2) = Workbooks("D.xls")

    For i = 0 To UBound(WBb, 1) '開いてるブックをループ
        For Each sh In WBb(i).Sheets
            n = Me.Cells(sh.Rows.Count, "A").End(xlUp).Row + 1
            If sh.Range("A2").Value = "" Then   'A2が空白の場合は何もしない
            Else
                c = Application.WorksheetFunction.Match("氏名", sh.Rows(6), 0)  '6行目で氏名を検索
                sh.Range("A7:B" & sh.Range("B" & Rows.Count).Offset(0, c - 1).End(xlUp).Row).Offset(0, c - 1).Copy _
                        Destination:=Me.Range("A" & n)
            End If
        Next sh
    Next i

 End Sub

(sy) 2017/08/18(金) 00:52


 >インデントは見やすくする為に、For〜Next や If〜End If の間の文を字下げする事です。

 すいません。
 ちょっと言葉足らずですね。
 別にForやIfだけに限らず、ループや条件式などの、始まり〜終わりが対になってる場合の、
 間に実行させるコードを字下げする事で、何処から何処までが一連の流れかを見やすくする為です。

(sy) 2017/08/18(金) 01:02


 よく頑張られたと思いました。

 0. インデント(字下げ)は既にご指摘のとおりです。
     ・オートインデント(Enterキーを押すと、次の行のカーソルは、現在行と同じ開始位置に行く)
     ・タブの利用
     ・アンタブの利用(シフトキーを押しながらタブで、タブの逆の働きになる)
     などを活用するとよいと思います。

 1.n = Me.Cells(sh.Rows.Count, "A").End(xlUp).Row + 1
    は結果としてうまくいきますが、Me と shを混在させる理屈はゼロです。
    n = Me.Cells(Me.Rows.Count, "A").End(xlUp).Row + 1
    と書くのが普通でしょう。

 2.変数の宣言を忘れずに。
   Option Explicitが自動で設定されるように、VBEのオプション設定を変更しておくことを推奨。
   ツール - オプション - 編集の 「変数の宣言を強制する」にチェックをつけるだけです。  
   今後作成されるモジュールの先頭に、自動でOption Explicitが書き込まれるはず。

 3.あえて Cells(j,k)という書き方を省略しましたが、コピーのところは以下のように書けます。
        c = Application.WorksheetFunction.Match("氏名", sh.Rows(6), 0)  '6行目で氏名を検索
        lastRow = sh.Cells(Rows.Count, c).End(xlUp).Row      ' 氏名列の最終行
        sh.Range(sh.Cells(7, c), sh.Cells(lastRow, c + 1)).Copy _
                Destination:=Me.Range("A" & n)

 4.氏名とコードの列が前後逆転している場合はこうはいきません。
   列ごとにコピーペイストすることになるでしょう。
   必要に応じて、ご自分でトライしてください。

(γ) 2017/08/18(金) 01:08


余談です。

私も変数宣言は上に纏める派です。
このスレッドでは質問者さんのコードを元にしたので、例外的ですね。

なぜ上に纏めるか、私見は、
実行文の動作を追うのに途中の宣言文は邪魔になる、というものです。
これは感覚的なものですね。
特に、変数宣言を要しない言語を使い続けてきたことが影響していると思います。
型に注意する思考と、意味を解釈する思考は混在させないほうが得策と思う。

変数宣言の変数の順序にもそれなりに気を使います。
機能的な意味で順序をつけています。
オブジェクト系が先。
一時的に使うループ変数などは変数宣言の最後に持ってきますね。

でも、特に .Net系を使う人たちの間では、使う直前に宣言する人が多いようですね。
どういうことなんだか。そう言う文化なんですな。

(γ) 2017/08/18(金) 01:25


 >このスレッドでは質問者さんのコードを元にしたので、例外的ですね。 

 そうだったんですね。
 下の方の文章しか読んでなかったので、
 あれぇ、γさんって途中で宣言してたっけ?
 いつからγさんは途中で宣言する派になったんだろう?
 と思いました。

 だからと言って、γさんの記述方針に意見するなんて大それた事までは、言うつもりは無かったですけど。
 γさんのご意見と同じように、あくまで個人的な感覚としての意見です。

 >でも、特に .Net系を使う人たちの間では、使う直前に宣言する人が多いようですね。 
 >どういうことなんだか。そう言う文化なんですな。
 私の感覚では、全く理解できないですね。

 >変数宣言の変数の順序にもそれなりに気を使います。
 ここまで気を使った事は無かったですね。
 でも大事ですね。
 今後気にしようと思います。
 ありがとうございました。

(sy) 2017/08/18(金) 01:42


 余談に反応です。

 >>でも、特に .Net系を使う人たちの間では、使う直前に宣言する人が多いようですね。 
 >>どういうことなんだか。そう言う文化なんですな。
 >私の感覚では、全く理解できないですね。

 質問者さんのコードは、おそらく私が最初に提示したコードを元に組み立てたので途中で宣言していると
 考えられます。

 私も以前は上にまとめる派から、色々読んで、試験的に直前宣言に致しました。
 プログラムは体系的に学んだことはありませんし、VBAがはじめてです。

 別スレッドでも書きましたが、分かりやすい変数名やコードの運び方を勉強している中での変更でして、
 色々意見を聞かせてもらえたら嬉しいです。
 付き合って頂けるようでしたら、別スレッド設けます。

 お邪魔致しました。

(稲葉) 2017/08/18(金) 08:47


sy様 宣言、実行文、インデントの説明ありがとうございます。何回も読みなおしてたら、すごくよく理解できました。

γ様  色々とありがとうございました。一歩(いや、半歩?)踏み出せました。
   4.氏名とコードの列が前後逆転している場合はこうはいきません。

     →いざ、コードを入れて動かそうと思ったのですが逆転していました。笑
      トライしてみます涙。

稲葉様 おっしゃる通り、コードをかなり参考にさせて頂きました。ありがとうございました。超素人の私の感覚ですが、直前宣言の方が分かりやすいです。

皆さまの纏める派、直前宣言派に関して、一つのプログラムで結果が同じでも、過程はたくさんあるのだなと思いました。
(まさこ) 2017/08/18(金) 12:30


 最初のシート間のコピペイスト(Test1)に戻って手を入れて見ます。

 Sub TEST1a()
     Dim sh      As Worksheet
     Dim ws2     As Worksheet
     Dim n       As Long
     Dim c       As Long
     Dim lastRow As Long

     Set sh = Sheets("sheet1")    ' 転記元
     Set ws2 = Sheets("sheet2")   ' 転記先

     n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1

     '氏名の列を転記
     c = Application.WorksheetFunction.Match("氏名", sh.Rows(6), 0)  '6行目で氏名を検索
     lastRow = sh.Cells(Rows.Count, c).End(xlUp).Row      ' 氏名列の最終行
     sh.Range(sh.Cells(7, c), sh.Cells(lastRow, c)).Copy _
             Destination:=ws2.Cells(n, 1)

     'コードの列を転記
     c = Application.WorksheetFunction.Match("コード", sh.Rows(6), 0)  '6行目でコードを検索
     lastRow = sh.Cells(Rows.Count, c).End(xlUp).Row
     sh.Range(sh.Cells(7, c), sh.Cells(lastRow, c)).Copy _
             Destination:=ws2.Cells(n, 2)
 End Sub

 2項目だとこれでもいいが、多数の項目になったら、繰り返しを使ったほうがいい。

 Sub TEST1b()
     Dim sh      As Worksheet
     Dim ws2     As Worksheet
     Dim ary     As Variant
     Dim e       As Variant
     Dim n       As Long
     Dim c       As Long
     Dim lastRow As Long
     Dim col     As Long

     Set sh = Sheets("sheet1")    ' 転記元
     Set ws2 = Sheets("sheet2")   ' 転記先

     n = ws2.Cells(ws2.Rows.Count, "A").End(xlUp).Row + 1

     '項目毎に繰り返し
     ary = Array("氏名", "コード")   ' 項目が多数あればここを増やす
     col = 1                         ' 転記先の列の初期値
     For Each e In ary
         c = Application.WorksheetFunction.Match(e, sh.Rows(6), 0)   ' 6行目で項目名を検索
         lastRow = sh.Cells(Rows.Count, c).End(xlUp).Row             ' 最終行

         sh.Range(sh.Cells(7, c), sh.Cells(lastRow, c)).Copy _
                 Destination:=ws2.Cells(n, col)
         col = col + 1               ' 次の書込のためにカウントアップ
     Next
 End Sub

 あとはこれを最終形に組み込んでみてください。

(γ) 2017/08/18(金) 17:32


稲葉さん、ご配慮ありがとうございます。
ただこの件は、かなり感覚に属するテーマですし、
白黒の話でもないので、議論は難しいでしょうね。
.netではブロック内のスコープに従う変数もあったりして仕様も違いますから、
違った文化になるのでしょう。
こちらの掲示板はあまり雑談は無いようですし、またの機会にご教示ください。

(γ) 2017/08/18(金) 17:37


 稲葉さん

 私もγさんと同じで感覚の問題だけと思います。
 なのでこの件で稲葉さんレベルの人に意見するなどと大それた事は申し上げる事は出来ません。

(sy) 2017/08/18(金) 21:26


>>でも、特に .Net系を使う人たちの間では、使う直前に宣言する人が多いようですね。
>>どういうことなんだか。そう言う文化なんですな。
>私の感覚では、全く理解できないですね。

ちょっと興味が出てきて、「変数宣言 先頭 直前」でググってみたのですが
最近では変数宣言を関数の先頭にまとめる派はいまいち分が悪いみたいですね・・・
(PUL) 2017/08/18(金) 22:34


 皆様ご意見ありがとうございます
 感覚に全く自信がないので、分かりにくいところは分かりにくい、と
 ご指摘いただければとの思いでした

 変数宣言が多すぎてわかりにくいなら、関数にまとめろだとか
 構造体をみにつけろだとか、手法についてもまだまだ勉強不足ですので
 今後もご指導いただければと思います
(稲葉) 2017/08/19(土) 07:45

γ様 氏名とコードが逆転している場合のコードの提示ありがとうございます。提示して下さったから、質問させて頂いた時と比べると、理解が出来ていて、組み込むのはとても早く完成はしていました。
    ary = Array("氏名", "コード") ' 項目が多数あればここを増やす
      col = 1                         ' 転記先の列の初期値
      For Each e In ary にて対応が出来るのですね。
しかし、上記式を自分なりにかみ砕くのに時間がかかりました。   
パターンで覚えようと思いました。

お礼が遅くなりましたが、すごく親切にして頂いてありがとうございました。
(まさこ) 2017/08/20(日) 14:35


ご苦労様でした。解決できて何よりです。
 
こうしたものは、0点か100点かではありません。(結果だけみるとそう見えるかもしれないが。)
課題をいくつかのステップにわけて、簡単なところから解決していけばよろしいかと思います。
その時点で既に60点だったりするわけで、
いつかは最初から100点ととれるようになるのではないですか?
 
途中までできて、しかし詰まってしまっったら、そこでこちらに相談されれば、
いくらでもサポートを受けられると思います。頑張ってください。

(γ) 2017/08/20(日) 17:59


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.