VBAの操作方法とセルの変更

このQ&Aのポイント
  • VBAを使用してセルの値や列数の変更方法について説明します。
  • テキストエディタで以下のVBAコードを作成し、セルの値や列数の変更を行うことができます。
  • VBAの操作についてわかりやすく説明しています。
回答を見る
  • ベストアンサー

VBAの解説

お世話になります 値、セルの操作ですが列数等の変更が生じたため変更を求められています。 下記VBA判りやすく説明できる方お願い致します。 Sub Macro1() Dim idxR, idxC, ptr As Integer Dim ws As Worksheet Set ws = ActiveSheet Worksheets.Add after:=ws ptr = 2 With ws .Rows(1).Copy Destination:=Range("A1") For idxR = 2 To .Range("A65536").End(xlUp).Row Cells(ptr, "A").Value = .Cells(idxR, "A").Value For idxC = 2 To 255 Step 2 If .Cells(idxR, idxC) = "" Then Exit For Else .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B") ptr = ptr + 1 End If Next idxC Next idxR End With End Sub

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

  • ベストアンサー
  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.1

お早うございます。 このマクロの説明で、理解出来るでしょうか。 Sub Macro1()   Dim idxR, idxC, ptr As Integer   Dim ws As Worksheet   '   Set ws = ActiveSheet        '前面に表示されているシートを「ws」の変数に設定                     '次から「元シート」と表現します。   Worksheets.Add after:=ws      '前面に表示されているシートの後ろに新しくシートを追加する                     'この時、追加シートがActive(前面表示)になります                     '次から「追加シート」と表現します。   ptr = 2               '「追加シート」用のRow(行)変数に「2」を代入する   With ws     .Rows(1).Copy Destination:=Range("A1")   '「元シート」の1行目を「追加シート」のセル「A1」へコピーする                           '「追加シート」の1行目にコピーされる     For idxR = 2 To .Range("A65536").End(xlUp).Row   '「元シート」のA列2行目から使っている行まで1行ずつ                               '処理を行う       Cells(ptr, "A").Value = .Cells(idxR, "A").Value '「元シート」のセル「A2」(次はA3~)の値を「追加シート」のセル「A2」(次はA?~)にコピー       For idxC = 2 To 255 Step 2       '2カラム~255カラムまで、2行ずつ処理を行う         If .Cells(idxR, idxC) = "" Then   '「元シート」もカラムにデータがないかをチェックする           Exit For            'データがない時はこの処理を止める         Else                           '「元シート」にデータがあり時、行の変数「idxR」に設定されている                           '行、カラム変数「idxC」に設定されているカラムから+1カラムの                           'データを「追加シート」のB列の行変数「ptr」に設定されている行にコピーする           .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B")           ptr = ptr + 1         '「追加シート」のRow(行)の変数に1を加算する         End If       Next idxC     Next idxR   End With End Sub < 処理内容 > 1.「元シート」の1行目を「追加シート」の1行にコピーする 2. 次の行(2~)は1行のデータを「追加シート」の行(2~)へ次のようにコピーする (1)「元シート」のAカラムのデータを「追加シート」のAカラムへコピー (2)「元シート」のBカラム~データがあるカラムまで、2セルずつ、「追加シート」のB列~C列へコピーする ※但し、「追加シート」の行を加算しながらB列~C列へコピーする 「元シート」にデータがあるまで、2の処理を繰り替える

BSR123
質問者

お礼

お返事ありがとうございます せっかく教えて頂いたのですが、わからないことだらけで何から聞けばいいのかわからなく途方にくれています。 スキルの低さに自分の未熟さを痛感しているところです 又、補足等に現状を簡単ですができるならもう少し、ご教授お願いします。 どちらにせよここでお礼を申し上げます ありがとうございます

BSR123
質問者

補足

お返事ありがとうございます 現状では、値貼り付け等の件であたふたしてまして 朝からずっと考えてもわからず難航しています、 現状を報告いたしますと、 10列目までは既存のままで 以降11列目から9列×10単位で操作をしたいのですが変更方法わかりますか?

その他の回答 (1)

  • pkh4989
  • ベストアンサー率62% (162/260)
回答No.2

お早うございます。 変更したい内容を具体的教えてください。 現状は以下のようになります。 <元シート> TAAA DBBB Tあああ D100 D200 D300 D400 D500 D600 D700 D800 D900 D1000 Tいいい D111 D222 D333 D444 D555 D666 D777 D888 D999 D1111 Tううう Daaa Dbbb Dccc Dddd Deee Dfff Dggg Dhhh Diii Djjj  ↓ <追加シート> TAAA DBBB Tあああ D100 D200     D300 D400     D500 D600     D700 D800     D900 D1000 Tいいい D111 D222     D333 D444     D555 D666     D777 D888     D999 D1111 Tううう Daaa Dbbb     Dccc Dddd     Deee Dfff     Dggg Dhhh     Diii Djjj >以降11列目から9列×10単位で操作をしたいのですが この意味は良く解りません。具体的に上記のように表として書いてください。

関連するQ&A

  • VBA 値、セル操作

    お世話になります [現状] 実行させると 1列目を残して2列づつ処理をさせています Sub Macro1() Dim idxR, idxC, ptr As Integer Dim ws As Worksheet Set ws = ActiveSheet Worksheets.Add after:=ws ptr = 2 With ws .Rows(1).Copy Destination:=Range("A1") For idxR = 2 To .Range("A65536").End(xlUp).Row Cells(ptr, "A").Value = .Cells(idxR, "A").Value For idxC = 2 To 255 Step 2 If .Cells(idxR, idxC) = "" Then Exit For Else .Cells(idxR, idxC).Resize(1, 2).Copy Destination:=Cells(ptr, "B") ptr = ptr + 1 End If Next idxC Next idxR End With End Sub [判らないこと] 前7列を残して(A:G) 8列目から(H列)より9列づつ処理をさせたいのですが判らなく大変困っております。 どなたかご教授よろしくお願いします。

  • エクセルのVBAの記述について

    VBAの記述についてなのですが、 Sub filter() Dim gyo As Long Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = Worksheets("データ") Set ws2 = Worksheets("チーム") Application.ScreenUpdating = False ws2.Range("A4:BH30").Clear gyo = ws1.Range("A65536").End(xlUp).Row ws1.Activate With ws1.Range(Cells(4, 1), Cells(gyo, 6)) .AutoFilter Field:=1, Criteria1:="A" .SpecialCells(xlCellTypeVisible).Copy ws2.Range("A4") Selection.AutoFilter End With Application.ScreenUpdating = True End Sub ならプログラムははしるのですが、 14行目を .SpecialCells(xlCellTypeVisible).Copy ws2.Range(Cells(4, 1)) だと 「実行時エラー 1004 Rangeメソッドは失敗しました Worksheet オブジェクト」 とでるのですが、出来ないのでしょうか? Cells(4, 1)の1のところを変数にして変えていきたいのですが、よい方法はありますか。 よろしくお願いいたします。

  • マクロが動作しない

    Office2003にバージョンアップすると動作しないマクロが出ました。ちゃんと動作するものもあります。 内容は変更していないので内容はあってるはずですが 念のためコピーします。 Sub 電装品() Dim Gyou As Integer Dim Gyouz As Integer Dim State As Integer Dim Statez As Integer Dim CelValue As String Dim CelValuez As String Dim CopyCelNo As String Dim CopyCelNoz As String Dim WS1 As Object Dim WS2 As Object Set WS1 = Worksheets("購入品リスト") Set WS2 = Worksheets("電装品リスト") WS2.Range("A:G").Delete Shift:=xlToLeft WS2.Range("B1") = "電 装 品 リ ス ト" With WS2.Range("B1") .Font.Bold = True .Font.Italic = True .Font.Size = 24 End With WS2.Range("D1") = "作成日:" & Date WS1.Range("C3:E3").Copy (WS2.Range("A2:C2")) State = 3 For Gyou = 1 To 2000 CopyCelNo = "A" & State CelValue = WS1.Cells(Gyou, 17).Value If CelValue = "1" Then WS1.Range(WS1.Cells(Gyou, 3), WS1.Cells(Gyou, 5)).Copy (WS2.Range (CopyCelNo)) State = State + 1 End If Next WS1.Range("G3:J3").Copy (WS2.Range("D2:G2")) Statez = 3 For Gyouz = 1 To 2000 CopyCelNoz = "D" & Statez CelValuez = WS1.Cells(Gyouz, 18).Value If CelValuez = "1" Then WS1.Range(WS1.Cells(Gyouz, 7), WS1.Cells(Gyouz, 10)).Copy (WS2.Range (CopyCelNoz)) Statez = Statez + 1 End If Next End Sub

  • Excel VBA 連番印刷

    昨日以下の質問をさせていただいた者です。 http://okwave.jp/qa/q8349562.html こちらで教えていただいた以下のコードに、 J2のセルに連番を振るコードを付け足したいと思い、 同じくこちらのサイトの過去の履歴にあった以下コードを参考にとやってみているのですが、 Next で指定された変数の参照が無効です。と言われてしまいます… 印刷部数の指定はいらず、sheet印刷のJ2セルに1から始まる連番を振りたいのです。 どのように修正をしたらいいのかご教示願います。 Sub Sample4() Dim i As Long, endRow1 As Long, endRow2 As Long, myArea1 As Range, myArea2 As Range Dim wS1 As Worksheet, wS2 As Worksheet, wS3 As Worksheet Set wS1 = Worksheets("DB") Set wS2 = Worksheets("印刷") Set wS3 = Worksheets("Sheet3") endRow1 = wS1.Cells(Rows.Count, "A").End(xlUp).Row Range(wS1.Cells(1, "A"), wS1.Cells(endRow1, "A")).AdvancedFilter Action:=xlFilterInPlace, unique:=True wS1.Range("A:A").Copy wS3.Range("A1") wS1.ShowAllData For i = 2 To wS3.Cells(Rows.Count, "A").End(xlUp).Row endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row If endRow2 > 9 Then Range(wS2.Cells(10, "B"), wS2.Cells(endRow2, "H")).ClearContents Range(wS2.Cells(10, "J"), wS2.Cells(endRow2, "J")).ClearContents End If wS1.Range("A1").AutoFilter field:=1, Criteria1:=wS3.Cells(i, "A") wS2.Range("B6") = wS3.Cells(i, "A") Set myArea1 = Range(wS1.Cells(2, "B"), wS1.Cells(endRow1, "H")).SpecialCells(xlCellTypeVisible) Set myArea2 = Range(wS1.Cells(2, "I"), wS1.Cells(endRow1, "I")).SpecialCells(xlCellTypeVisible) myArea1.Copy wS2.Activate ActiveSheet.Range("B10").Select Selection.PasteSpecial Paste:=xlPasteValues myArea2.Copy wS2.Activate ActiveSheet.Range("J10").Select Selection.PasteSpecial Paste:=xlPasteValues endRow2 = wS2.Cells(Rows.Count, "B").End(xlUp).Row 'Range(wS2.Cells(1, "A"), wS2.Cells(endRow2, "J")).PrintOut Next i wS1.AutoFilterMode = False wS3.Cells.Clear End Sub 連番印刷のコード Sub NumberPrint() Dim idx As Integer Dim res  res = Application.InputBox("印刷部数を入力してください", Type:=1)  If res > 0 Then   For idx = 1 To res    Range("AW3").Value = idx    ActiveSheet.PrintOut   Next idx  End If End Sub

  • VBA Range・Cellsプロパティについて

    下記のコードについて質問致します。 Sub 特定のセルをコピー() Dim rw2 As Long Dim rw1 As Long Dim newdate As Date With Worksheets("steet1") rw2 = .cells(.Rows.Count, "c").End(xlUp).Row newdate = .Range("c" & rw2).value For rw1 = rw2 - 1 To 1 Step -1 If .Range("c" & rw1).value <> newdate Then Exit For Next rw1 .Range(.cells(rw1 + 1, 1), .cells(rw2, 1)).Copy     '(1) Worksheets("steet2").Range("v6").PasteSpecial xlValue End With End Sub (1)部分のコードの意味が分かりません。 よろしくお願いします。

  • このVBAコードの解説をお願いします。

    特定の行の中で同じものが続いたらセルを結合する、ということがやりたくて 以下のコードをネット上から探してきました。 上記の動作は実現できたのですが、自分でこのコードをみてもイマイチわかりません。 お分かりになる方、できれば1行ずつ解説してください。 よろしくお願いします。 Sub Sample() Dim myRng As Range, myRow As Long Set myRng = Range("A1") For myRow = 1 To Cells(Rows.Count, 1).End(xlUp).Row With Cells(myRow, 1) If .Value = .Offset(1).Value Then Set myRng = Union(myRng, .Offset(1)) Else Application.DisplayAlerts = False myRng.Merge Application.DisplayAlerts = True Set myRng = .Offset(1) End If End With Next End Sub

  • EXCEL2011 Objectに入れたWork…

    お世話になります。 どうも よく、解らない の、ですが 下記で コメントアウト、させている ラインの、内 *印を、付けている どの行、をも コメントアウトから、戻すと ☆で、添付映像の エラーに、なります コメントアウトの、ままだと エラーには、なりません 察するに Wsが ActiveSheetで、無いと with Ws に、対する .Range(cells(… が、嫌っぽい の、ですが こんな事、当たり前 なのか 疑問、なのです お教え下さい。     記 Option Explicit Option Base 0 Dim Data(100, 100) As Long, Ch As Long, s1 As Long, s2 As Long, Ws As Worksheet, すとり As Range Sub testMain() ' 簡易テスト Dim 現状保存 As Worksheet, シート名 As String  Let シート名 = ActiveSheet.Name Application.ScreenUpdating = False  Worksheets(シート名).Copy after:=Worksheets(Worksheets.Count)  '■  Set 現状保存 = ActiveSheet                            '■  Set Ws = Worksheets.Add() ' Worksheets(シート名).Copy after:=Worksheets(Worksheets.Count)  '*□ ' Set 現状保存 = ActiveSheet                      ’□ ' Worksheets(シート名).Select                    '*  現状保存.Visible = False ' Ws.Visible = False                       '* Application.ScreenUpdating = True  Call ダミーデータ作成  Call testC  Call testV  Call testE Application.DisplayAlerts = False 現状保存.Delete Ws.Delete Application.DisplayAlerts = True End Sub Sub ダミーデータ作成()  With Ws.Range("a1:cv100")   .Formula = "=RANDBETWEEN(1,10000)"   .Calculate   .Value = .Value  End With  Let Ws.Cells(1, 101).Formula = "=MIN(" & Ws.Name & "!" & Ws.Range("a1:cv100").Address & ")"  Ws.Cells(1, 101).Calculate  For s2 = 1 To 100   For s1 = 1 To 100    Data(s1, s2) = Ws.Cells(s1, s2).Value   Next s1  Next s2  Let Data(0, 0) = Ws.Cells(1, 101).Value End Sub Sub testC()  Ch = 10000  With Ws   For s2 = 1 To 100    For s1 = 1 To 100     If Ch > .Cells(s1, s2).Value Then Ch = .Cells(s1, s2).Value    Next   Next  End With End Sub Sub testV()  Ch = 10000   For s2 = 1 To 100    For s1 = 1 To 100     If Ch > Data(s1, s2) Then Ch = Data(s1, s2)    Next   Next End Sub Sub testE()  With Ws   すとり = .Range(Cells(1, 1))                 '☆  End With End Sub (※注:□の2行を コメントから 外す、時は  同、■の2行を コメントアウトして、下さい)                       以上

  • (VBA)Splitの抜き出しが上手くいかない

    以下のようなコードで「指定区切り文字」の前後で文字列を切り出しています。 添付画像見てもらえれば判ると思いますが B8セルからのB列の値が「29:08」が正解なのに 「29:08:00」と最後に「:00」が付いた形式になっています。 (B13で1時間を過ぎると正常になっています。) このため、以後のE及びF列の書き出しもおかしな値となりました。 どのように修正すれば良いでしょうか ? Option Explicit Sub Chapter_Plus() Dim I As Long Dim J As Long Dim TEMP As Variant Dim SepChr As String Dim WS1 As Worksheet Dim WS2 As Worksheet Dim EndLow As Long Dim LineData As String Dim OutText As String Dim byteData() As Byte '一時格納用 Set WS1 = Worksheets("DATA") Set WS2 = Worksheets("Chapter") 'シートの初期化 WS1.Range("B3:H100").Clear WS2.Range("A1:A100").Clear SepChr = InputBox("指定文字を入力してください。", "区切り文字入力", " ") 'TotalLength = InputBox("時間を(h:mm:ss)で入力してください。", "ファイルサイズ入力") EndLow = WS1.Cells(Rows.Count, "A").End(xlUp).Row With WS1 '区切り文字で切り出す For I = 3 To EndLow TEMP = Split(.Cells(I, "A"), SepChr) .Cells(I, "B") = TEMP(0) .Cells(I, "C") = TEMP(1) Next '仮チャプター書き出す For I = 3 To EndLow .Cells(I, "E").Value = Format(.Cells(I, "B").Value, "hh:mm:ss") .Cells(I, "F").Value = Format(.Cells(I + 1, "B").Value, "hh:mm:ss") .Cells(I, "G").Value = .Cells(I, "C").Value Next '番号 For I = 3 To EndLow .Cells(I, "H").Value = CStr(Format(I - 2, "'00")) Next End With End SUB

  • VBAのループ処理について

    VBA(Excel2000)にて、参考書等を見て下記のコードを作成しました。 「セルA1かA10において、同じ数値が続けて入力されたら、最後のセル(一番下のセル)をB列にコピーする。」 Sub ループ() Dim a As Long With Range("a1:a10") For a = 1 To .Count - 1 If .Cells(a).value <> .Cells(a + 1).value Then .Cells(a, 2).value = .Cells(a).value End If Next .Cells(.Count, 2).value = .Cells(.Count).value End With End Sub 上記の「For idx = 1 To .Count - 1」の意味が分かりません。 よろしくお願いします。

  • [VBA] For文の使い分けについての疑問

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2010(14.0.7128.5000) ・疑問点 For each nextもFor nextも、最下行まで処理をしたいときに使用することが多いのですが、 単列の場合はFor each next、複数列の場合はFor nextというような使い方をしています。 例:For each next Sub test()  Dim ws As Worksheet  Dim r As Range  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For Each r In ws.Range("A1:A" & endRow)   If r.Value Mod 2 = 0 Then r.Font.Bold = True  Next r End Sub 例:For next Sub test2()  Dim ws As Worksheet  Dim i As Long  Dim endRow As Long  Set ws = ThisWorkbook.Sheets(1)  endRow = ws.Cells(Rows.Count, 1).End(xlUp).Row  For i = 1 To endRow   If ws.Cells(i, 1).Value Mod 2 = 0 Then ws.Cells(i, 1).Font.Bold = True   If ws.Cells(i, 2).Value Mod 3 = 0 Then ws.Cells(i, 2).Font.Bold = True  Next i End Sub 単純に、複数列での処理をする場合にはFor each next文を2つ書かないといけないと思い(込み)、 上記のような運用にしていますが、そもそもこの考え方は合っていますでしょうか? 単列の処理であってももちろんFor next文で問題なく使用できますし、 複数列の処理の場合もFor each next文で処理することはできます(冗長ですが)が、 VBA的に正しいというか、合理的な考えであるのかどうかが疑問です。 みなさんはFor each nextとFor nextをどのように使い分けていますか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

専門家に質問してみよう