[[20140708195505]] 『データーの転記』(ちぃさん) ページの最後に飛ぶ

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

 

『データーの転記』(ちぃさん)

お世話になります。
かなり未熟ながらもマクロに挑戦していますが、調べても解らないことが出てきたので教えていただけないでしょうか。
宜しくおねがいします。

http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/prog/prog01.html
こちらを見まして解らないなりに

.Range("A" & myRow & ":Z" & myRow).Value = sh1.Range("A2:A5").Value
この部分を
.Range("A" & myRow & ":Z" & myRow).Value = sh1.Range("A2,A3,A4,A5").Value
このように変えたのですが思っていたのと違う感じに転記されます。

希望は

転記させるシート

     ---A---   ---B---   ---C---  . . . . .
1  
2      5
3      4
4      6
5      8
.

転記されるシート

     ---A---   ---B---   ---C---   ---D---  . . . . .
1    5         4         6         8
2   
3
.

     ↑このようにしたいのですが変更したマクロですと

転記されるシート

     ---A---   ---B---   ---C---   ---D---   ---E---   ---F---   ---G---  . . . . .
1    5         5         5         5         5         5         5
2   
3
.

           ↑このようになります。

.Range("A" & myRow & ":Z" & myRow).Value = sh1.Range("A2,A3,A4,A5").Value
このコードをどのように変えればよいでしょうか?
どうぞお手柔らかにお願いいたします。

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


 >.Range("A" & myRow & ":Z" & myRow).Value = sh1.Range("A2,A3,A4,A5").Value 

   .Range("A" & myRow & ":Z" & myRow).Value = Application.Transpose(sh1.Range("A2:A27").Value)

   ※縦のものを横に並べるのでしょうから、Transpose関数で行列を入替え処理したらどうですか?
   ・・にしても、左辺と右辺のセル数はチャンと合わせてくださいね。(A-Z列なら26個じゃないですか?)

(半平太) 2014/07/08(火) 21:44


(半平太)さん回答ありがとうございます。

>・・にしても、左辺と右辺のセル数はチャンと合わせてくださいね。(A-Z列なら26個じゃないですか?)
失礼いたしました。

ご指摘されているとおりA列からZ列までA2の値のみが転記されております。
1ページ目に記載していますA2,A3,A4,A5というのは実際に使う際に選択位置がランダムとなるため
A2:A5

A2,A3,A4,A5
として試してみました。
説明不足で申し訳ございません。

使用目的といたしましてデーター取りをしたいのです。
ですので、選択した順番に転記したいのです。
Range("A2,A3,A4,A5").Value
と例えは4個ですが選択している順番に

転記されるシート

     ---A---   ---B---   ---C---   ---D---  . . . . .
1    5         4         6         8
2   
3
.
と転記させていのです。

出来ますでしょうか?
(ちぃさん) 2014/07/08(火) 22:10


 >1ページ目に記載していますA2,A3,A4,A5というのは実際に使う際に選択位置がランダムとなるため 
 >A2:A5 
 >を 
 >A2,A3,A4,A5 
 >として試してみました。 

 ランダムなら、A2,A4,A5 とか B3,C2:R3,A5 とかで試すべきではないですか?

 サンプル作りはセンスを問われます。

 まぁ、どんな範囲だとしても、
 このやり方なら、泥臭いですけど処理できます。
  ↓
 書き込み列番号 = 0
 For Each 各セル in ランダム範囲
  書き込み列番号=書き込み列番号 + 1
  .cell(myRow,書き込み列番号).Value = 各セル.Value
 Next

(半平太) 2014/07/08(火) 22:47


(半平太)さん回答ありがとうございます。

試してみます。
(ちぃさん) 2014/07/10(木) 21:40


 参考にされたサイトで解説されている「転記」の部分だけ抜粋すると
 シートで一度計算させて値で上書きする方法だとこんな感じですかね?
Sub Chili()
    Dim 転記元セル As String
    Dim 転記元シート As String
    Dim 転記先書出し As Variant
    転記元シート = "=Sheet1!"                                    '★「=」と「!」を忘れずに付ける
    転記元セル = "#A1,#B3,#C7"                                   '★区切り文字「,」 置換文字「#」を忘れず付ける
    転記元セル = Replace(転記元セル, "#", 転記元シート)          '★「#」を「転記元シート」に置き換えて、数式にする
    転記先書出し = Application.Transpose(Split(転記元セル, ",")) '★「,」区切りで配列にし、Transposeで2次配列にする
    With Sheets("sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, UBound(転記先書出し, 1))
        .Formula = Application.Transpose(転記先書出し)           '★数式としてSheet2に書き出す
        .Value = .Value                                          '★値として上書きする
    End With
End Sub

 ・・・最も転記手段以外はもう少し面倒な処理をしていますが・・・
(稲葉) 2014/07/11(金) 09:47

(稲葉)さん回答ありがとうございます。

いま外出中ですので帰宅してから試してみます。

ありがとうございます。
(ちぃさん) 2014/07/12(土) 18:30


すみません。
別のBookに転記すれば

転記先Book
   ---A---   ---B---   ---C---
1 12:00:00AM      0       0

となるのですが何故でしょうか?
未熟すぎてスミマセン。

Sub Chili()

    Dim 転記元Book As String
    Dim 転記先Book As String
    Dim 転記元セル As String
    Dim 転記元シート As String
    Dim 転記先書出し As Variant
    Dim 場所 As String
    転記元Book = ThisWorkbook.Name
    転記先Book = "データー.xlsx"
    場所 = "C:\Users\Owner\Desktop\"
    On Error Resume Next
    Workbooks.Open 場所 & 転記先Book
    転記元シート = "=Sheet1!"                                    '★「=」と「!」を忘れずに付ける
    転記元セル = "#L4,#L5,#L6"                                   '★区切り文字「,」 置換文字「#」を忘れず付ける
    転記元セル = Replace(転記元セル, "#", 転記元シート)          '★「#」を「転記元シート」に置き換えて、数式にする
    転記先書出し = Application.Transpose(Split(転記元セル, ",")) '★「,」区切りで配列にし、Transposeで2次配列にする
    With Workbooks("データー.xlsx").Sheets("sheet2").Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, UBound(転記先書出し, 1))
        .Formula = Application.Transpose(転記先書出し)           '★数式としてSheet2に書き出す
        .Value = .Value                                          '★値として上書きする
    End With
End Sub

としています。
もしよければ教えていただけないでしょうか。
宜しくおねがいします。
(ちぃさん) 2014/07/13(日) 08:00


 嫌味じゃないけど・・・嫌味に聞こえるだろうけど
 サンプルにセンスがないって言われませんでした??
 最初はシートって言っていましたよね?
 なぜ最初から別のブックと説明しないのですか?

 >    転記元セル = "#L4,#L5,#L6"
 ここの部分も、ランダムなの? 連続したセルなの?
 ランダムなセルと連続したセルでは全く処理が異なります。

 >.Formula = Application.Transpose(転記先書出し)           '★数式としてSheet2に書き出す
                                                               ~~~~~~~~~~~~~~~~~~~~~~~~~
 提示したコードでも、「数式として書き出す」とあります。
 「=Sheet1!L4」を他のブックに書いて、別ブックのデータ取れますか?

 これ以上仕様が変更しないよう、もう一度サンプルを精査してから、
 再度ここにコメントしてください。 

 少なくとも、半平太さんのやり方ならできるはずですので、試した結果も載せてください。

(稲葉) 2014/07/14(月) 09:16


(稲葉)さん すみません。

正直言ってマクロは全く解りません。
勉強しながら理解しつつ組めればと思いましてコチラに書き込みを始めたのですが、言葉足らずな部分が多々あり申し訳ありません。

>なぜ最初から別のブックと説明しないのですか?
別のシートに転記できれば別のBookに転記するときに
Workbooks("データー.xlsx")
と付け足せればできるのかな?と思ってました。
プログラムの勉強などはした事はありませんので、どこをどうしたらどのように変わるかは理解できていないです。
未熟者の考えるような事で申し訳ありません。

>ここの部分も、ランダムなの? 連続したセルなの?
元の値を入力するセルの位置を変更し忘れていました。
ランダムなセルの例えとして考えていました。
申し訳ありません。

>ランダムなセルと連続したセルでは全く処理が異なります。
知りませんでした。
申し訳ありません。

>「=Sheet1!L4」を他のブックに書いて、別ブックのデータ取れますか?
知識不足で理解できていませんでした。
申し訳ありません。

>これ以上仕様が変更しないよう、もう一度サンプルを精査してから、
>再度ここにコメントしてください。
1、マクロボタンをクリック
2、転記先のブックと転記先のシート立ち上げ
 ※今後の事を考え転記先のブック、シートは追加できるようにしておきたい
3、入力したシートから別のBookの指定したシートの最下行へA列から順番にに転記
 ※1,A列は転記日時としたいので実際はB列からの転記としたい

  ※2,転記先のシートにはマクロコードに記述している順番に転記したい
4、自動保存
最終はこのような形になるようにするつもりでした。

>少なくとも、半平太さんのやり方ならできるはずですので、試した結果も載せてください。

>書き込み列番号 = 0
> For Each 各セル in ランダム範囲
>  書き込み列番号=書き込み列番号 + 1
>  .cell(myRow,書き込み列番号).Value = 各セル.Value
> Next
コチラのコードは今、調べていますが理解できていませんのでまだ全く形になっていません。
デバッグで確認するとエラーがでたり、...が足りませんとか表示されて何が必要なのか全く解りません。
時間がかかると思いますが出来しだい載せます。

以上です。
すみません。

(ちぃさん) 2014/07/14(月) 10:52


追加
>4、自動保存
これは転記先のブックのことです。

(ちぃさん) 2014/07/14(月) 10:55


 出来る限り分かりやすく記述しました。
 何をどういう処理して、どういう結果になるか理解してから手直ししてください。
 F8を押してステップ実行や、ブレークポイントを置いて変数にカーソルを合わせて期待通りの値に
 なっているかを確認するなど、出来ることを実施してから「分からない」と聞いてください。
Option Explicit
'
Sub Chili2()
    '//転記元のブックに書く
    Dim r As Range
    Dim c
    Dim tbl
    '
    '//転記元シートを開いた状態で行う処理
    Set r = Range("B5,J1,H7,E14,B8")
    ReDim tbl(1 To r.Count)
    Dim i As Long
    i = 1
    For Each c In r
        tbl(i) = c.Value
        i = i + 1
    Next c
    '
    '//転記先のパスとシート
    Const 転記先BOOK As String = "C:\エクセルの学校\ちぃ\転記先.xlsm"
    Const 転記先SHET As String = "Sheet1"
    '
    '//ブックが開かれていた場合の処理
    On Error Resume Next
    Open 転記先BOOK For Append As #1
    Close #1
    If Err > 0 Then
        MsgBox "転記先ブックが読み取り専用です。読取専用を解除してから再度実施してください。"
        Exit Sub
    End If
    On Error GoTo 0
    '
    '//転記シートの処理
    Workbooks.Open 転記先BOOK
    With Workbooks(Dir(転記先BOOK))
        With .Sheets(転記先SHET)
            .Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, UBound(tbl)) = tbl
        End With
        Application.DisplayAlerts = False
        .Save
        .Close
        Application.DisplayAlerts = True
    End With
    MsgBox "転記しました"
End Sub
(稲葉) 2014/07/14(月) 16:10

こんにちは。

端的に言って、ちぃさんは何も悪くないです。
リンク先のサイトに書いてあることと、ちぃさんが実現したいことは
全然違いますから、あちらを参考にしてもできないのが当たり前です。

ちぃさんはご自分が悪いからと感じておられるようにお見受けしますが
こんなの誰にだってできません。試す前から無理なんです。別件ですから。

ただ、あちらを参考にこれを実現しよう、という方針を立てたところは
うまくないですね。試す前から無理なことを目指しちゃいけません。

思うに、あちらのサイトをいったん全部通読して、書いてあることを
書いてあるままに理解して、全体が見えてから応用を考えてはどうでしょう。
たぶんそのほうが、結局は早いと思います。

( 佳 ) 2014/07/14(月) 18:08


(稲葉)さん すみません。回答ありがとうございます。

ご教授いただいたマクロコード試してみました。
すみませんが起動させるとエラーが出ます。
訂正方法が解らないので手間とは思いますがよければ再び教えて頂けないでしょうか?

ご教授いただきましたコードをコチラのBook名に変更し、起動してみました。
    ↓↓↓
Sub Chili2()

    '//転記元のブックに書く
    Dim r As Range
    Dim c
    Dim tbl
    '
    '//転記元シートを開いた状態で行う処理
    Set r = Range("B5,J1,H7,E14,B8")
    ReDim tbl(1 To r.Count)
    Dim i As Long
    i = 1
    For Each c In r
        tbl(i) = c.Value
        i = i + 1
    Next c
    '
    '//転記先のパスとシート
    Const 転記先BOOK As String = "C:\Users\Owner\Desktop\Book2.xlsx"
    Const 転記先SHET As String = "Sheet1"
    '
    '//ブックが開かれていた場合の処理
    On Error Resume Next
    Open 転記先BOOK For Append As #1
    Close #1
    If Err > 0 Then
        MsgBox "転記先ブックが読み取り専用です。読取専用を解除してから再度実施してください。"
        Exit Sub
    End If
    On Error GoTo 0
    '
    '//転記シートの処理
    Workbooks.Open 転記先BOOK
    With Workbooks(Dir(転記先BOOK))
        With .Sheets(転記先SHET)
            .Range("A" & Rows.Count).End(xlUp).Offset(1).Resize(, UBound(tbl)) = tbl
        End With
        Application.DisplayAlerts = False
        .Save
        .Close
        Application.DisplayAlerts = True
    End With
    MsgBox "転記しました"
End Sub

起動前にデバッグで確認しても何もエラー表示は出ないのですが
マクロを起動しますと

実行時エラー'1004':
Excelでファイル'Book2,xlsx'を開くことができません。ファイル形式またはファイル拡張子が正しくありません。ファイルが破損しておらず、ファイル拡張子とファイル形式が一致していることを確認してください。

とでます。
その後デバッグをクリックすると

 Workbooks.Open 転記先BOOK

のところで黄色くなってます。
何が駄目なのでしょうか。

( 佳 )さん回答をありがとうございます。
勉強不足な私が悪いのでしかたないです。
ありがとうございます。
>思うに、あちらのサイトをいったん全部通読して、書いてあることを
>書いてあるままに理解して、全体が見えてから応用を考えてはどうでしょう。
>たぶんそのほうが、結局は早いと思います。
ですね。
一応、リンク先のサイトに書いてあることをそのまま同じようにして試したのですが思うようにはできずコチラにご相談に参りました。
ありがとうございます。

(ちぃさん) 2014/07/14(月) 18:46


連続投稿すみません。

(稲葉)さん失礼しました。
Book2を新しく作りなおすと正しく動きました。

ありがとうございました。
(ちぃさん) 2014/07/14(月) 18:52


コメント返信:

[ 一覧(最新更新順) ]


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