質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

Q&A

解決済

2回答

1668閲覧

【VBA】コードを短縮したいです(初学者)

pinkieee

総合スコア1

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

リファクタリング

リファクタリングとはコードの本体を再構築するための手法であり、外見を変更せずに内部構造を変更/改善させることを指します。

0グッド

0クリップ

投稿2021/10/07 22:14

前提・実現したいこと

VBAのコードを短縮したいです。

VBA初学者です。
問題なく動作するものの、後学のために
より効率の良い記述を教えて頂きたいです。

宜しくお願いします。

■ 処理内容

A列に文字列が入っている間、列に対して順番に
文字列を加工・日付型に変換する処理を行います。

該当のソースコード

Sub editString() Dim row As Integer row = 2 '文字列を左から8文字目まで切り出して日付型に変換 Do Until Cells(row, 1).Value = "" Cells(row, 4).Value = CDate(Left(Cells(row, 4).Value, 8)) row = row + 1 Loop row = 2 Do Until Cells(row, 1).Value = "" Cells(row, 5).Value = CDate(Left(Cells(row, 5).Value, 8)) row = row + 1 Loop row = 2 Do Until Cells(row, 1).Value = "" Cells(row, 8).Value = CDate(Left(Cells(row, 8).Value, 8)) row = row + 1 Loop End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hex309

2021/10/07 22:52

例ということなのでしょうけれど、文字列の先頭から8文字を切り出して日付型になるような、8文字ってどんな文字ですか?「20210910」みたいな8文字だと、うまく行かないな、と思ったもので。 本筋とは違ってすみません。
pinkieee

2021/10/08 05:46

hex309 様 ご連絡下さりありがとうございます。 「21/09/10(金) 13:00」このような文字列です。
guest

回答2

0

ベストアンサー

下記のように一回のループに纏めるだけでかなり簡略化できると思うけど、

vba

1Sub editString() 2 3 Dim row As Integer 4 row = 2 5 6 '文字列を左から8文字目まで切り出して日付型に変換 7 Do Until Cells(row, 1).Value = "" 8 Cells(row, 4).Value = CDate(Left(Cells(row, 4).Value, 8)) 9 Cells(row, 5).Value = CDate(Left(Cells(row, 5).Value, 8)) 10 Cells(row, 8).Value = CDate(Left(Cells(row, 8).Value, 8)) 11 row = row + 1 12 Loop 13 14End Sub

自分がするなら、

vba

1Sub editString() 2 3 Dim rng As Range 4 Set rng = Range(Cells(2,1), Cells(rows.count,1).End(xlUp)) 5 6 '文字列を左から8文字目まで切り出して日付型に変換 7 Dim c As Range 8 For Each c In rng.Cells 9 c.Offset(,3).Value = CDate(Left(c.Offset(,3).Value, 8)) 10 c.Offset(,4).Value = CDate(Left(c.Offset(,4).Value, 8)) 11 c.Offset(,7).Value = CDate(Left(c.Offset(,7).Value, 8)) 12 Next 13 14End Sub

こんなのも。

vba

1Sub editString() 2 3 Dim rng As Range 4 Set rng = Range(Cells(2, 1), Cells(Rows.Count, 1).End(xlUp)) 5 Set rng = Union(rng.Offset(, 3), rng.Offset(, 4), rng.Offset(, 7)) 6 7 '文字列を左から8文字目まで切り出して日付型に変換 8 Dim c As Range 9 For Each c In rng.Cells 10 c.Value = CDate(Left(c.Value, 4)) 11 Next 12 13End Sub

投稿2021/10/07 23:22

編集2021/10/08 00:34
hatena19

総合スコア33782

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinkieee

2021/10/08 05:40

hatena19 様 早速のご回答ありがとうございます。 ループの作り方やOffset関数など 一層理解・興味を深めることができました。 ベストアンサーとさせて頂きます。 お忙しい中、ご丁寧な回答重ねて感謝致します。
guest

0

最大行を取得する方法が定石としてあるので、それを使用します。
行を表す変数:rowですが、intger型(-32768~32767)で確保するよりはLong型(約10桁まで格納可能)で確保したほうが安全です。
又、変数名:rowはプロパティにrowがあるので、その名称は使わないほうが無難です。
teratailのこの掲示板ではrowの文字が青色で表示されてます。

VBA

1Sub editString() 2 Dim maxrow As Long 3 Dim wrow As Long 4 maxrow = Cells(Rows.count, 1).End(xlUp).row '1列の最大行取得 5 '文字列を左から8文字目まで切り出して日付型に変換 6 For wrow = 2 To maxrow 7 Cells(wrow, 4).Value = CDate(Left(Cells(wrow, 4).Value, 8)) 8 Cells(wrow, 5).Value = CDate(Left(Cells(wrow, 5).Value, 8)) 9 Cells(wrow, 8).Value = CDate(Left(Cells(wrow, 8).Value, 8)) 10 Next 11End Sub 12

投稿2021/10/08 01:11

tatsu99

総合スコア5462

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pinkieee

2021/10/08 05:43

tatsu99 様 早速のご回答ありがとうございます。 今後はLong型で確保するようにします。 変数名:rowも確かに仰る通りリスクがありますね。 詳しい方から教えて頂くまで考えもしませんでした。 一層理解・興味を深めることができました。 お忙しい中、ご丁寧な回答重ねて感謝致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問