質問するログイン新規登録

質問編集履歴

1

質問内容の変更

2020/04/11 08:00

投稿

Chandler_Bing
Chandler_Bing

スコア673

title CHANGED
@@ -1,1 +1,1 @@
1
- VBA アクティブシートが選択されていない
1
+ VBA シートごとの列数とカラム数を取得できない
body CHANGED
@@ -1,153 +1,43 @@
1
1
  いつもお世話になっております。
2
2
 
3
+ 表題の通りです。シートをForEachしているつもりなのですが、
3
- 昨日も質問頂きましたが続き
4
+ 実行時に選択いるシート行数とカラム数しか取得きません
4
5
 
5
- したいことは以下で
6
+ 在のエクセルのシート状態、VBAのコード、実行結果を貼りま
6
- [VBAでダブルコーテーションがうまく表示できない](https://teratail.com/questions/252813?whotofollow=)
7
7
 
8
- 現在一つのブック内に複数のシートがあった場合に、
9
- そのシートごとのカラムを取得し、それをキーにした連想配列を作成したいです。
10
-
11
- イメージのエクセルです。
12
8
  ![エクセルの値](62cc496ece60fa2baf55cca4033d88d9.png)
13
9
 
14
10
  現在のコードは以下です。(シート名に意味はないのであまり気にしないでください)
15
11
 
12
+ ```VBA
16
13
 
17
- ```vba
18
14
  Sub makeSeeder()
19
-
20
- '組織コードを定義
21
-
22
15
  Dim Ws As Worksheet
23
16
  For Each Ws In Worksheets
17
+ 'カラム数と行数を格納
18
+ Dim clms_cnt As Integer
19
+ clms_cnt = Ws.Application.CountA(Range("1:1"))
24
20
 
25
- 'ファイル名変数
26
- Dim fle_nm As String
21
+ Dim row_cnt As Integer
27
- fle_nm = "Acc"
22
+ row_cnt = Ws.Application.CountA(Range("A:A"))
28
23
 
29
- 'シート名を取得
24
+ 'ウィンドウに表示させる
30
- tmp_sht_nm = Ws.Name
25
+ Debug.Print Ws.Name
31
-
32
- '一文字ずつセルに表示するメイン処理
33
- For i = 1 To Len(tmp_sht_nm)
34
-
35
- '最初の一文字を大文字にして取得
36
- If i = 1 Then
37
- fle_nm = fle_nm & UCase(Mid(tmp_sht_nm, i, 1))
38
- GoTo Continue
39
- End If
40
-
41
- 'アンスコの場合は次の文字を大文字にして取得
42
- If Mid(tmp_sht_nm, i, 1) = "_" Then
43
- fle_nm = fle_nm & UCase(Mid(tmp_sht_nm, i + 1, 1))
44
- 'インクリメント
45
- i = i + 1
46
- Else
47
- fle_nm = fle_nm & Mid(tmp_sht_nm, i, 1)
48
- End If
49
- Continue:
50
- Next i
51
- 'ファイル名の作成処理終了(シーダー作成開始)
52
-
53
- 'カラム数と行数を格納
54
- Dim clms_cnt As Integer
55
- clms_cnt = Ws.Application.CountA(Range("1:1"))
56
-
57
- Dim row_cnt As Integer
58
- row_cnt = Ws.Application.CountA(Range("A:A"))
59
-
60
- Debug.Print clms_cnt
26
+ Debug.Print clms_cnt
61
- Debug.Print row_cnt
27
+ Debug.Print row_cnt
62
-
63
- 'カラム名を配列に格納
64
- Dim clm_arr() As Variant 'lengthは条件によって変わる
65
- ReDim clm_arr(clms_cnt) As Variant
66
-
67
- For i = 1 To clms_cnt
68
- clm_arr(i - 1) = Ws.Cells(1, i)
69
- Next i
70
-
71
- 'PHPの連想配列を作成
72
- Open "C:\Users\xxxx\OneDrive\デスクトップ\テストデータシーダー\" & fle_nm & "Seeder.php" For Append As #1
73
- Print #1, "<?php"
74
- Print #1, "return ["
75
- For i = 2 To row_cnt
76
- Print #1, " ["
77
- For j = 1 To clms_cnt
78
- Print #1, " """ & clm_arr(j - 1) & """" & " => " & """" & Trim(Ws.Cells(i, j)) & ""","
79
- Next j
80
- Print #1, " ],"
81
- Next i
82
- Print #1, "];"
83
- Close #1
84
-
85
28
  Next Ws
86
-
87
29
  End Sub
88
30
 
31
+ '実行結果
32
+ 't_abc_def
33
+ '5
34
+ '7
35
+ 't_ghi_jkl
36
+ '5
37
+ '7
89
38
  ```
90
39
 
40
+ 実行する際は「イメージ」シートは削除した状態で行っています。
91
- これを実行すると、clms_cnt 「row_cnt」VBAドを実行するときに選択されているものしかってこられません
41
+ Ws.Name」が動作しているでシトはForEachで回せていると思うのですが
92
- どの記述を修正すればよいですか???
93
42
 
94
- 以下実行結果の一部です。
95
- ```php
96
- <?php
97
- // t_abc_def
98
- return [
99
- [
100
- "column1" => "1",
101
- "column2" => "1",
102
- "column3" => "1",
103
- "column4" => "1",
104
- "column5" => "1",
105
- "column6" => "1",
106
- "column7" => "1",
107
- "column8" => "1",
108
- "column9" => "1",
109
- "column10" => "1",
110
- ],
111
- [
112
- "column1" => "2",
113
- "column2" => "2",
114
- "column3" => "2",
115
- "column4" => "2",
116
- "column5" => "2",
117
- "column6" => "2",
118
- "column7" => "2",
119
- "column8" => "2",
120
- "column9" => "2",
121
- "column10" => "2",
122
- ],
123
-
124
- // t_ghi_jkl
125
- return [
126
- [
127
- "カラム1" => "11",
128
- "カラム2" => "11",
129
- "カラム3" => "11",
130
- "カラム4" => "11",
131
- "カラム5" => "11",
132
- "" => "",
133
- "" => "",
134
- "" => "",
135
- "" => "",
136
- "" => "",
137
- ],
138
- [
139
- "カラム1" => "12",
140
- "カラム2" => "12",
141
- "カラム3" => "12",
142
- "カラム4" => "12",
143
- "カラム5" => "12",
144
- "" => "",
145
- "" => "",
146
- "" => "",
147
- "" => "",
148
- "" => "",
149
- ],
150
- ```
151
-
152
- 値はきちんと別シートのものを参照してるで、foreachは機能していると思うのですが、、、。
153
- よろしくお願いします。
43
+ ご教示よろしくお願いします。