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

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

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

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

Q&A

解決済

2回答

767閲覧

VBAを用いて.txt内の48個のデータを6個ずつに分けて入力する方法

ukuu

総合スコア1

VBA

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

0グッド

0クリップ

投稿2021/12/15 02:02

編集2021/12/15 04:44

前提・実現したいこと

VBAを使用し、下記のような入力がしたいです
①.txtファイルを選択し、指定の48個のデータを抽出
↑ここまではできています
②48個のデータ内の最初の6個を、作業者が選択したセルから縦に入力
③縦に4つ飛ばし、次の6個を縦に入力
④最初に選択したセルから右に4行飛ばし、次の6個を入力 
⑤また縦に4つ飛ばし、次の6個を入力
このループを4回分

また、今回は48個・6個ずつ・4つ飛ばしとしていますが、
今後は56個・7個ずつ・3つ飛ばしなどの入力もありますので、
8の倍数に対応した方法も教えていただけると幸いです

分かりにくい内容で申し訳有りませんが、ご教授よろしくお願い致します
イメージ説明

発生している問題・エラーメッセージ

該当のソースコード

Sub 入力()
Dim NUMB As Variant
Dim 配列(9999) As Double
Dim i As Integer
Dim POG As Variant
Dim k As Integer
Dim strFileName As String
Dim strFilePath As String
Dim a As Long

strFilePath = "ファイルの場所" strFileName = X(strFilePath) Workbooks.OpenText Filename:= _ strFilePath & strFileName, Origin:=932, _ StartRow:=1, DataType:=xlDelimited, TextQualifier:=xlDoubleQuote, _ ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma:=False _ , Space:=False, Other:=False, fieldinfo:=Array(Array(1, 1), Array(2, 1), _ Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), _ Array(10, 1), Array(11, 1), Array(12, 1), Array(13, 1), Array(14, 1), Array(15, 1), Array( _ 16, 1), Array(17, 1), Array(18, 1), Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), _ Array(23, 1), Array(24, 1), Array(25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array( _ 29, 1), Array(30, 1), Array(31, 1), Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), _ Array(36, 1), Array(37, 1), Array(38, 1), Array(39, 1), Array(40, 1), Array(41, 1)), _ TrailingMinusNumbers:=True Dim j As Long, l As Long l = 1 For j = 2 To 1000 l = l + 1 If InStr(Cells(j, 4), "指定の文字列") = 0 Then Exit For End If Next For i = 1 To l 入力(i) = Range("J" & i + 1).Value Next Workbooks(1).Worksheets("Sheet1").Activate Set POG = Application.InputBox(prompt:="入力開始するセルをクリック", _ Default:=ActiveCell.Address, Type:=8) l = l - 2 a = l / 8 For i = 1 To a k = i - 1 POG.Offset(k, 0).Value = Round(入力(i)) Next For i = a + 1 To a * 2 k = i - 7 POG.Offset(10 + k, 0).Value = Round(入力(i)) Next For i = (a * 2) + 1 To a * 3 k = i - 13 POG.Offset(k, 4).Value = Round(入力(i)) Next For i = (a * 3) + 1 To a * 4 k = i - 19 POG.Offset(10 + k, 4).Value = Round(入力(i)) Next For i = (a * 4) + 1 To a * 5 k = i - 25 POG.Offset(k, 8).Value = Round(入力(i)) Next For i = (a * 5) + 1 To a * 6 k = i - 31 POG.Offset(10 + k, 8).Value = Round(入力(i)) Next For i = (a * 6) + 1 To a * 7 k = i - 37 POG.Offset(k, 12).Value = Round(入力(i)) Next For i = (a * 7) + 1 To a * 8 k = i - 43 POG.Offset(10 + k, 12).Value = Round(入力(i)) Next Workbooks(strFileName).Close True Exit Sub

試したこと

あまりにもコードが冗長になってしまったので
きれいで分かりやすい書き方を教えていただけるとありがたいです

補足情報(FW/ツールのバージョンなど)

Excel 2016 Win10 です

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

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

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

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

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

y_waiwai

2021/12/15 02:03

そのコードを提示しましょう
m.ts10806

2021/12/15 02:15

コードがキレイかどうかはともかく、想定通り動いて不具合がないのならそれで良いのでは。 全て美しくある必要はないですし、今のコードも提示されないなら質問ではなくなってしまっています。
1T2R3M4

2021/12/15 02:25

もともとコード書く気が無いのでしょ。 作業依頼ですよね。
ukuu

2021/12/15 04:46

ご指摘いただいた皆様 大変申し訳有りません、コードの記入がないと修正箇所も指摘できないですよね コードの記入をさせていただきましたので、お手数ですがもう一度ご確認頂ければ幸いです また、それに伴い説明文にも若干の変更がございますのでよろしくお願い致します
guest

回答2

0

ベストアンサー

6個ずつ・4つ飛ばし、7個ずつ・3つ飛ばしの条件と貼られた画像だけ見るとn個入力後、選択セルから10行下のセルからn個入力して右に4列移動の繰り返しで良さそうに感じました。
ループ部分だけですが

VBA

1 Dim POG As Range 2 Dim i As Long, j As Long, k As Long, l As Long, m As Long 3 4 Set POG = Application.InputBox(prompt:="入力開始するセルをクリック", _ 5 Default:=ActiveCell.Address, Type:=8) 6 7 i = 1 8 j = 6 9 10 For m = 1 To 4 11 For l = 1 To 2 12 For k = 1 To j 13 POG.Offset(k - 1 + (l - 1) * 10, (m - 1) * 4).Value = i 14 i = i + 1 15 Next 16 Next 17 Next

投稿2021/12/15 06:20

bebebe_

総合スコア513

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

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

0

アイデアだけ提示しておきますので、それをヒントに自分でできるところまでコードを書いてみてください。

まず、「作業者が選択したセルから」とか「48個・6個ずつ・4つ飛ばし」「56個・7個ずつ・3つ飛ばし」などの変化する条件は、プロシージャの引数として渡すといいでしょう。

vba

1Sub MyProc(StartCell As range, DataCount As Long, GroupCount As Long, SkipNum As Long) 2 3End Sub

画像をみると、2×4の配置に出力するようですので、For Next を入れ子にして処理していくといいでしょう。

vba

1 Dim i as Long, j as Long 2 For i = 1 to 2 3 For j = 1 to 4 4 5 Next 6 Next

あるいはMod演算子を使って余りを計算できますので、余りが0の時がグループの区切りと判断する方法も使えます。

投稿2021/12/15 02:56

hatena19

総合スコア34075

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

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

ukuu

2021/12/15 04:48

コードも無い中、ご回答いただきありがとうございます 頂いたヒントをもとに検討させていただきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問