VBAの操作方法とセルの変更
- 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
- BSR123
- お礼率29% (71/241)
- オフィス系ソフト
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
お早うございます。 このマクロの説明で、理解出来るでしょうか。 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の処理を繰り替える
その他の回答 (1)
- pkh4989
- ベストアンサー率62% (162/260)
お早うございます。 変更したい内容を具体的教えてください。 現状は以下のようになります。 <元シート> 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
- ベストアンサー
- Excel(エクセル)
- 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)部分のコードの意味が分かりません。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- この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行を コメントアウトして、下さい) 以上
- ベストアンサー
- Excel(エクセル)
- (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
- ベストアンサー
- Excel(エクセル)
- 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」の意味が分かりません。 よろしくお願いします。
- ベストアンサー
- Visual Basic
- [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をどのように使い分けていますか? 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。
- ベストアンサー
- Excel(エクセル)
お礼
お返事ありがとうございます せっかく教えて頂いたのですが、わからないことだらけで何から聞けばいいのかわからなく途方にくれています。 スキルの低さに自分の未熟さを痛感しているところです 又、補足等に現状を簡単ですができるならもう少し、ご教授お願いします。 どちらにせよここでお礼を申し上げます ありがとうございます
補足
お返事ありがとうございます 現状では、値貼り付け等の件であたふたしてまして 朝からずっと考えてもわからず難航しています、 現状を報告いたしますと、 10列目までは既存のままで 以降11列目から9列×10単位で操作をしたいのですが変更方法わかりますか?