• ベストアンサー

配列に格納したデータを指定行以下に転記する方法

excel2000を使っています。 以下のコードだと最終行にデータが転記されます。これを4行目に確定して、転記したいのです。常に4行目つまりA列4行目以下に上書きしたいのです。 その場合コードをどのように変更すべきでしょうか? Sub 配列() With ActiveSheet ' 配列に格納 --------------------------- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 --------------------------- SaleAry = Array(.Range("t4"), .Range("e5"), .Range("g5"), .Range("o5")) End With ' 転記 --------------------------- With Worksheets("daityou") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) ' Next i End With Set SaleAry = Nothing End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

回答してくださった方の質問に満足に回答されていらっしゃいませんね。きちんと補足回答されるほうが解決が早くなると思いますよ。 1)「常に4行目つまりA列4行目以下に上書きしたい」は「常に4行目に書き込む」という意味でしょうか? もしその通りなら質問文のマクロの下から5行目を以下にするだけで良いかもしれません。 .Cells(4, i + 1).Value = SaleAry(i) 2)「ご回答2件とも実行しましたが出来ませんでした」とは具体的にどのような結果になったのですか? それでは次の回答が書けませんよ。 3)「上の続きで次のコードを実行したいのです」??  補足に書かれているマクロから質問文のマクロをコールしているように見えます。少し表現が違いませんか?  それはさておいて、結局やりたいことは「"A", "B", "C", "D", "E", "F", "G", "H", "I", "J"の10枚の各シートで、T4→A4、E5→B4、G5→C4、O5→D4の転記を行う」ことでよろしいでしょうか? もしそうであれば以下のマクロ1つだけで実現できると思います。(2つに分けてももちろん問題はないですが…) 4つのセルしかないなら配列を使うまでもないでしょう。 Sub 転記作業() Dim List Dim SheetName As String Dim idx As Integer  On Error Resume Next  List = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")  For idx = 0 To UBound(List)   With Worksheets(List(idx))    .Range("A4").Value = .Range("T4").Value    .Range("B4").Value = .Range("E5").Value    .Range("C4").Value = .Range("G5").Value    .Range("D4").Value = .Range("O5").Value   End With  Next idx  Worksheets("daityou").Activate End Sub 既にご存知とは思いますがマクロはALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。マクロの実行はALT+F8でマクロ一覧を開き、マクロ名を選択して「実行」ボタンです。 またシート名は全角文字、半角文字を間違えると正しい結果にならないのでお気をつけください。

aitaine
質問者

お礼

仰せのとおりで深く反省しています。VBAは奥がふかいこと身にしみています。ご回答者の方々の気分を害されたことお詫び申し上げます。非常に簡略化されたスクリブとでご指導の方法でつくりなおしてみます。 本当にありがとうございました。

その他の回答 (4)

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.4

ついでに補足です。クリアせず上書きなら Sub 転記作業2()     Dim n As Long     Dim list, SheetName          Application.ScreenUpdating = False     list = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")     n = 4     For Each SheetName In list         Call sample2(Sheets(SheetName), n)         n = n + 1     Next     Worksheets("daityou").Activate     Application.ScreenUpdating = True End Sub Sub sample2(sh As Worksheet, i As Long)     Dim SaleAry As Variant        With sh         SaleAry = Array(.Range("t4").Value, .Range("e5").Value _                            , .Range("g5").Value, .Range("o5").Value)     End With     Worksheets("daityou").Cells(i, 1).Resize(, 4).Value = SaleAry     Erase SaleAry End Sub ...な感じ。

aitaine
質問者

お礼

詳しくご丁寧なご回答に感謝申し上げます。 今実行しましたら出来ました。ありがとうございました。

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.3

#2補足へのレスです。 ...... >手作業でもマクロでも良いのでA4:D4以下をクリアして、 と書いたように、 Sub 転記作業()     Application.ScreenUpdating = False     Dim list, SheetName     list = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") '     With Worksheets("daityou") '■          .Range("D4", .Range("A65536").End(xlUp)).ClearContents '■     End With '■     For Each SheetName In list         Sheets(SheetName).Activate         Call 配列     Next     Worksheets("daityou").Activate End Sub ...として、元のSub 配列()を使うわけにはいかないのですか?

  • pauNed
  • ベストアンサー率74% (129/173)
回答No.2

こんにちは。 4行目『固定』なら Sub sample()   Dim SaleAry As Variant      With ActiveSheet     ' 配列に格納 ---------------------------     SaleAry = Array(.Range("t4").Value, .Range("e5").Value, .Range("g5").Value, .Range("o5").Value)   End With   ' 転記 ---------------------------   Worksheets("daityou").Cells(4, 1).Resize(, 4).Value = SaleAry   Erase SaleAry End Sub 配列に格納する時に、『.Range("t4")』とすると、Range型で格納され、SaleAryはObject型になります。 『.Range("t4").Value』などとすると値だけの格納になります。 A列4行目『以下』という意味が、このマクロを実行するごとに4行目→5行目...と上書きさせたい という意味なら、ちょっとややこしいと思います。 その場合は、4行目に上書きしたい直前に、手作業でもマクロでも良いのでA4:D4以下をクリアして、 元のSub 配列()を使えば良いのではないかと思います。

aitaine
質問者

補足

ご回答2件とも実行しましたが出来ませんでした。上の続きで次のコードを実行したいのです。説明不足ですいません。 Sub 転記作業() Application.ScreenUpdating = False Dim list, SheetName list = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") ' For Each SheetName In list Sheets(SheetName).Activate Call 配列 Next Worksheets("daityou").Activate End Sub

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 特に、配列に入れる必要性はないようですね。 「常に4行目以下に上書き」ということは分かりませんが、常に4行目に上書きなら、このようになります。なお、元のコードは、Set SaleAry = Nothing は、ちょっとへんです。Erase のはずです。 Sub 配列R()   With ActiveSheet     ' 配列に格納 ---------------------------     Dim i As Integer     Dim LastRow As Long     Dim SaleRng As Range     ' 配列に格納 ---------------------------     Set SaleRng = .Range("t4,e5, g5, o5")   End With   ' 転記 ---------------------------   With Worksheets("daityou")   'A列4行目に上書き(     LastRow = 4     For i = 1 To SaleRng.Areas.Count       .Cells(LastRow, i).Value = SaleRng.Areas(i)     Next i   End With   Set SaleRng = Nothing End Sub   

関連するQ&A

  • 以下のデータがあり、これをExcel VBAの連想配列として格納したい

    以下のデータがあり、これをExcel VBAの連想配列として格納したいと考えています。 MsgBoxでキーとアイテムを表示させると表示されるのですが、 最後に一例としてExistsで確認するとFalseが返ってきます。 これは配列に格納されていないのでしょうか。 また格納されていないとすると、どうすれば格納できるのでしょうか。 A 列   B列 35   apple 37   orange 40   banana 以下がコードです。 sub test() Dim i as integer Dim myDic as Object Dim keys as Variant Set myDic = CreateObject("Scripting.Dictionary") For i = 1 to 3 myDic.Add Cells(i, 1), Cells(i, 2) Next i keys = myDic.keys For Each keys In myDic MsgBox "キー名:" & keys & vbCr & "値:" & myDic.Item(keys) Next keys MsgBox myDic.Exists(35) End Sub

  • VBA:日付を配列に入れ別セルに転記するとデータ型が変わる

    データを別シートに転記するVBAコードを書いていて気付きました。 日付データをバリアント型の配列に入れて、再度書き出すと 21/2/2005 のように表示され、さらに日付ではなく、文字列になってしまいました。 具体的には下記のような内容です。Sheet1 の A1:A10 に 2005/2/21 のような日付が入力されています。 1. セル範囲のデータをバリアント型の配列に格納 2. 1.を別のセルへ一括転記を行う Sub TestMacro()   Dim Buf As Variant   With Sheets("Sheet1").Range("A1:A10")     Buf = .Value     '・・・(1)     .Offset(0, 3) = Buf  '・・・(2)   End With End Sub ウォッチ式で変数を確認すると(1)および(2)の時点では #05/02/21# Variant/Date型 と正しく日付として扱われているようです。しかし、転記されたセルを見てみると、「文字列で 21/2/2005 」となっているのです。 2005/2/21 が返されるものと思うのですが、なぜ、このような現象が起こるのでしょうか?何かとんでもない勘違いをしているのでしょうか? テスト環境は Win98SE + EXCEL2002 です。よろしくお願いします。

  • 各ボックスの値を、指定セルに転記したいのですが

    エクセル2007で作成 ・入力シートでユーザーフォーム1を呼出す。 B列の最終行をアクティブセルとする ・コンボボックス1にて部署名を選択。 ・コンボボックス2にて個人名を選択。 Sub ComboBox2_Click() Dim lastRow As Long Dim myLlist As String Dim R As Long myLlist = ComboBox2 With UserForm1 Select Case myLlist Case "○○ △△" ’個人名 .ListBox1.RowSource = "○○!B1:B100" ←B100ではなく、最終行に変更したい End Select End With End Sub ・リストボックス1にて作業名を選択(複数可)後、決定コマンドボタンにて確定。  入力シートのアクティブセルにコンボボックス1の値を転記  右隣セルにコンボボックス2の値を転記  さらに右隣にリストボックス1の値を転記 Sub 決定_Click() ActiveSheet.Unprotect Dim 行 As Long Dim 列 As Long Dim i As Integer Dim LB As String With UserForm1 行 = ActiveCell.Row 列 = ActiveCell.Column UserForm1.ComboBox1.Value = Cells(行, 列) UserForm1.ComboBox2.Value = Cells(行, 列 + 1) With ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) = True Then LB = LB & .List(i, 0) LB = Cells(行, 列 + 2) ←ココを変更したい End If Next i End With End With End Sub 個人名シートの指定範囲は、最終行までとしたい。 転記後、D列の1セルの中に選択した複数の作業名が入ってしまうので、 作業名単位で行を分けたい。 その時、同一部署なら同名をB列の下の行に、 同一人物なら同名もC列の下の行に転記したい。 以上、行いたい事項です。 方法がわからず困っています。 どなたかご教授頂きますよう、宜しくお願い致します。

  • フォルダ内にあるテキストファイル複数行転記について

    Excel VBAにて、フォルダ内のテキストファイルの複数行をExcelに転記するにはどうしたら良いでしょうか。 WEBサイトで似たようなものがありましたが、このマクロは2行目のみの転記です。 実際は14、18、28、32行目を転記したいです。 +αで条件を追加すると以下のようになります。 ①フォルダ内には100件近くのテキストファイルがあり、全て順番に処理をしていく ②抽出したい行にはタブで数字が5つほど並んでいます。(画像の用な感じです。) ③28、32行目は転記しデータを区切った後、左側2つの数字は削除したいです。(全てのテキストファイルに適用) ④特に空白行は作らず、下に追加していく。(A1から開始) ⑤シートを新しく追加する。 Excelはo365を使用しています。 参考にしたマクロは以下のものです。 初心者の為、すみませんが教えてください。よろしくお願いします。 ******************************************** '指定フォルダの全テキストの任意行を取得 Sub GetAllTextData() 'フォルダ指定用のダイアログを表示します With Application.FileDialog(msoFileDialogFolderPicker) 'カレントディレクトリを指定します .InitialFileName = ThisWorkbook.Path '設定しなかったら終了します If .Show = False Then Exit Sub '設定したフォルダを表示します Dim Fname Fname = .SelectedItems(1) End With '参照設定 Dim FSO As Object, Folder As Variant, File As Variant Set FSO = CreateObject("Scripting.FileSystemObject") Dim FilePath As Variant ReDim FilePath(1 To 100) As Variant '指定フォルダ内の.txtファイルを探索します i = 0 For Each File In FSO.GetFolder(Fname).Files If InStr(File.Name, ".txt") > 0 Then i = i + 1 FilePath(i) = File.Path 'ファイルのフルパスを取得 End If Next '配列の大きさは状況に応じ変更してください Dim Hozon, GetData As Variant ReDim GetData(1 To 100, 1 To 100) As Variant '全テキストファイルの任意行のデータを取得する m = 0 For k = 1 To UBound(FilePath, 1) 'テキストファイルが存在する場合に実行 If IsEmpty(FilePath(k)) = False Then '保存する配列を空にする ReDim Hozon(1 To 100, 1 To 100) As Variant 'テキストを開いて配列にデータを保存 Open FilePath(k) For Input As #1 i = 0 'テキストをすべて取得する Do Until EOF(1) Line Input #1, buf i = i + 1 'コンマ区切りでデータを取得する a = Split(buf, ",") For j = 0 To UBound(a, 1) Hozon(i, j + 1) = a(j) Next Loop Close #1 '▼取得したいデータに応じ変更してください '任意行の値を取得する i = 2 '2行目のデータを取得 m = m + 1 For j = 1 To UBound(Hozon, 2) GetData(m, j) = Hozon(i, j) Next End If Next 'データ貼り付け With ActiveSheet .Range(.Cells(2, 1), .Cells(2, 1).Offset(UBound(GetData, 1) - 1, UBound(GetData, 2) - 1)) = GetData End With End Sub (参考サイト:https://daitaideit.com/vba-get-alltext/)

  • 変数を配列に格納する時に、二つの条件を指定すること

    変数を配列に格納する時に、二つの条件を指定することはできますか? VBAです。 Private Sub test() Dim i As Long Dim Str As String Dim tmp As Variant Str = "a,i,u-e-o" tmp = Split(Str, ",") '配列に格納する For i = LBound(tmp) To UBound(tmp) Debug.Print tmp(i) Next i End Sub の場合、結果が a i u-e-o になってしまいます。 tmp = Split(Str, "," or "-") のようなことをして a i u e o と表示させたいです。 "a,i,u-e-o"を"a,i,u,e,o"にすることはできません。ご教授よろしくお願いします。

  • 配列変数に格納したデータを計算する方法はありますか?

     簡単な例ですが、例えばB列にあるデータの平均値を求めるときに以下のようにしています。 sub 平均計算()   Dim X(1 To 1000, 1 To 1) As Variant, i as Integer   For i = 10 To 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Cells(i - 9, 2), Cells(i, 2)))   Next   Range(Cells(1, 1), Cells(1000, 1)) = X End Sub  ここで処理速度改善のため、B列のデータを別の配列変数Yに格納してから平均値を求めるというようなことをしたいのですが、そんなことは可能でしょうか?イメージとしてはこんな感じです。   Y = Range(Cells(1, 2), Cells(1000, 2))   for i = 1 to 1000     X(i, 1) = WorksheetFunction.Average _          (Range(Y(i - 9, 2), Y(i, 2)))   Next  当然これはエラーになってしまいますが、このようなことを可能にする方法があれば、どなたか教えてください!よろしくお願いします。

  • VBAの動的配列について

    いつもお世話になっております。 エクセルVBAを学習中の者です。 動的配列についてお伺いします。 添付資料を見て頂きたいのですが、 シート名1~4に同一レイアウトの表があります。 これらの表をを2次元配列に格納し、その後、同一レイアウトのシートに一括転記したいと考えています。 転記の事を考えて、条件としては、 シート1から2行目以降のデータを配列『data』に格納、変数『dataCnt』が転記先の行番号と同じになるように考えています。 当初は、配列の定義を『Dim data(100,3) As Variant』と、多めに要素数を定義して、コードを記述していました。 正直、凄く気持ちが悪い感じでした・・・ 最近、動的配列を学習しまして、 シートごとにデータの行数を変数『lastRow』に格納して、配列を再定義して【データ数=要素数】とならないか? と思い、下記のようなコードを書いてみました。 が、『ReDim Preserve~』で実行エラーが発生してしまいます。 原因がなぜかわかりません! そもそも、動的配列はこのような使い方は出来ないのでしょうか? Sub テスト() Dim data() As Variant Dim x As Long Dim i As Long Dim ii As Long Dim lastRow As Long Dim dataCnt As Long dataCnt = 2 For x = 2 To 5 Worksheets(x).Activate lastRow = Cells(Rows.Count, 1).End(xlUp).Row If x = 2 Then ReDim data(2 To lastRow, 3) Else ReDim Preserve data(2 To dataCnt + lastRow - 1, 3) End If For i = 2 To lastRow For ii = 1 To 3 data(dataCnt, ii) = Cells(i, ii) Next ii dataCnt = dataCnt + 1 Next i Next x End Sub どなたかご指導をよろしくお願いいたします。

  • Dictionaryのitemを効率よく配列に格納

    まだエクセル2000です。 A列に商品名(約1,000種類) B列に分類名(10種類) C列に売上高 がある表があります。 (実際はその他の欄もありますが、質問のため単純化しています) 1行1レコードで時系列順に記載されていますので商品名も分類名も重複しています。 (もちろんデータ自体は重複していません。) 行数は不定です。 このデータから、各商品ごとに各分類別の売上高一覧(同一商品名でも分類が違えば別に集計)を作成するため、Dictionaryオブジェクトを利用して以下のマクロを書きました、 Sub test01()   Dim myDic As Object   Dim myV, myW, myX   Dim i As Long, n As Long   Dim ws As Worksheet   With Sheets("Test01")     myV = .Range("A1", .Cells(Rows.Count, "C").End(xlUp)).Value '対象範囲を配列に   End With   ReDim myW(1 To UBound(myV), 1 To 3) '一覧データ格納用2次元配列サイズ設定   Set myDic = CreateObject("Scripting.Dictionary")   For i = 1 To UBound(myV)     If Not myDic.Exists(myV(i, 1) & myV(i, 2)) Then '商品+分類が初出なら       myDic.Add myV(i, 1) & myV(i, 2), myV(i, 3) 'keyに追加、itemに売上       n = n + 1 'カウント       myW(n, 1) = myV(i, 1) '配列に商品名       myW(n, 2) = myV(i, 2) '配列に分類名     Else '商品+分類が既出なら       myDic(myV(i, 1) & myV(i, 2)) = myDic(myV(i, 1) & myV(i, 2)) + myV(i, 3) 'itemに売上加算     End If   Next i   ReDim myX(0 To UBound(myDic.Items)) 'item配列格納用1次元配列サイズ設定   myX = myDic.Items '1次元配列にItem格納   For i = 1 To UBound(myDic.Items) + 1     myW(i, 3) = myX(i - 1) '配列から配列へitemデータ複写   Next i   Set ws = Sheets.Add 'シート追加   ws.Range("A1").Resize(UBound(myDic.keys) + 1, 3).Value = myW '配列張り付け   Set myDic = Nothing   Set ws = Nothing End Sub これで正常かつ高速に作動するのですが、疑問点があります。 itemのデータを2次元配列、myWの3列目に格納するのに、いったん1次元配列myXを経由しなくともよい方法はないのかということです。 ここを変えてみても多分実行速度にほとんど影響はないとは思いますが、何か無駄なことをしているようで気になります。 itemを配列myWにとりこまず、直接ワークシートのC1以下にApplication.Transpose(myDic.items)で張るのが効率的と思いますが、わたしのエクセルがまだ2000のため、Transpose関数の限界、5461個にひっかかるおそれがあり、使えません。 どうかご教示ください。

  • 配列に使うArry関数について

    winXP Excel2003でマクロ作成している初心者です。 1)指定した4個のシート以外を選択するコードを教えていただきました。  これを利用して list = Array("AAA会社", "BBB会社", "CCC会社", "DDD会社", "EEE会社", ・・以下略") の 部分を手修正でなく、追加削除にも対応できるように指定シート以外を選択したいのですがうまくいきません。 どうかお助けください。 ーーーーーーーーーーーーーーーーーーーーーーーーーーー 教えていただいたコード Sub 請求書入力()   ' // 処理を除外するシート名リスト   Const EXCEPT_NAME = "集計用 印刷用 リンク用 会社見本"   Dim sh As Worksheet   For Each sh In ThisWorkbook.Worksheets     If InStr(EXCEPT_NAME, sh.Name) = 0 Then       sh.Activate       Call 請求書作成用部品     End If   Next End Sub ーーーーーーーーーーーーーーーーーーーーーーーーーー 現在のマクロコード Sub 請求一覧表作成() Application.ScreenUpdating = False ChDrive ThisWorkbook.Path ChDir ThisWorkbook.Path Call BookOpen("請求書入力.xls") Dim list, SheetName Sheets("請求一覧表").Select Range("A4:U15").Select Selection.ClearContents Range("A4").Select list = Array("AAA会社", "BBB会社", "CCC会社", "DDD会社", "EEE会社", ・・以下略") ↑この部分はシートの追加・削除の度に手修正している。 For Each SheetName In list Sheets(SheetName).Activate Call 配列 Next Worksheets("請求一覧表").Activate ActiveSheet.Protect End Sub ーーーーーーーーーーーーーーーーーーーーーーー Sub 配列() With ActiveSheet ' 配列に格納 -- Dim i As Integer Dim LastRow As Long Dim SaleAry As Variant ' 配列に格納 -- SaleAry = Array(.Range("C8"), .Range("D13"), .ange("T30")・・・以下略)) End With ' 転記 --- With Worksheets("請求一覧表") LastRow = .Range("A65536").End(xlUp).Row For i = 0 To UBound(SaleAry) .Cells(LastRow + 1, i + 1).Value = SaleAry(i) Next i End With Set SaleAry = Nothing End Sub

  • マクロエラー処理

    下記のマクロを実行すると、If (.Range のところでコンパイルエラー参照が不正または不完全です。というメッセージが出るのですが、どこを修正すればよいのでしょうか 教えてください。 Sub 再表示1() Dim SheetName As String Dim i As Integer Dim LastRow As Integer Dim rng As Range LastRow = 3000 '最終行の番号 Sheets("ACT").Select For i = 6 To LastRow If (.Range("D" & i) = "A310" Or .Range("D" & i) = "A505") And .Range("V" & i) < 0 Then .Cells(i, "W").Resize(1, 3).ClearContents End If Next Stop End With End Sub

専門家に質問してみよう