Excel (VBA) |
![]() ![]() |
(Windows 10全般 : Excel 2013)
1-6等が1月6日に変わってしまう
投稿日時: 20/12/02 10:24:05
投稿者: vaioyuki
|
---|---|
いつもお世話になっています。
With wsKaisha '会社シート i = 0 ReDim B(199999, 66) Open strFilePath2 For Input As #1 '会社.csvパス名を開く Do Until EOF(1) Line Input #1, buf A = Split(buf, ",") For j = 0 To UBound(A) B(i, j) = A(j) Next j i = i + 1 '2行目から開始 Loop Close #1 .Range("A6").Resize(200000, 67) = B For j = 5 To 66 .Cells(5, j) = WorksheetFunction.CountA(.Range(.Cells(6, j), .Cells(i, j))) '列のカウント Next j End With この中で「1-6」等のデータが「1月6日」等に変わってしまいます。 コピー先シートのセルを文字列に設定すると「1-6」で表示されるのですが、 そうすると5行目のCountAが前セルカウントしてしまいます。 元々のセルの設定は 標準 です。 よろしくお願いします。 |
![]() |
投稿日時: 20/12/02 10:29:44
投稿者: vaioyuki
|
---|---|
追記です。
|
![]() |
投稿日時: 20/12/02 11:56:31
投稿者: Suzu
|
---|---|
引用: 改善を行いたい点として ・「1-6」を 値としたい → 値を入れる前に、セルの書式を文字列とする → 値を入れる際に、プレフィックスとして「'」を与える ・「1-6」を 表示したい → 値を入れる際に、先頭にスペースを加える → 値としては、日付データとなっているので、セルの書式を「y-d」とする ここまでは、VBAに限らず Excelの ありがた迷惑(?)でもある機能であり 一般機能でも一緒ですね。 設定等で OFFにする事もできません。 良く判らないのですが、COUNTA 関数なのであれば 1-6 が 文字列、日付 どちらとも、計算対象としなりますよね? COUNT関数 と 勘違いされていますか? |
![]() |
投稿日時: 20/12/02 13:53:55
投稿者: vaioyuki
|
---|---|
Suzuさん、ありがとうございます。
.Cells(5, j) = WorksheetFunction.CountA(.Range(.Cells(6, j), .Cells(i, j))) こちらでCountAで計算しているのですが、 セルの設定を文字列にすると、 CountA独特の空白ではなく貼り付けた時点で空白でも長さ0の文字列としてカウントされているようです。 VBA上ではなく、 実際にExcelにCountA関数を入力しても空白までもがカウントされます。(;▽;) |
![]() |
投稿日時: 20/12/02 14:49:36
投稿者: WinArrow
|
---|---|
>.Cells(5, j) = WorksheetFunction.CountA(.Range(.Cells(6, j), .Cells(i, j)))
|
![]() |
投稿日時: 20/12/02 15:06:00
投稿者: vaioyuki
|
---|---|
WinArrowさん、ありがとうございます。
For j = 7 To 68 .Cells(5, j) = WorksheetFunction.CountIf(.Range(.Cells(6, j), .Cells(r_KaishaEX, j)), "?*") '列のカウント Next j こちらに変更してみました。 すると、空白としてみられるセルはカウントしなくなったのですが、 「●」と「あり」のように記号と日本語が混じっている行は「●」しかカウントされなくなりました。 ますますわからなくなりました。。。 |
![]() |
投稿日時: 20/12/02 15:15:37
投稿者: WinArrow
|
---|---|
Dim Buf As String, FNO As Integer i = 0 ReDim B(66, i) '★ FNO = FreeFile Open strFilePath2 For Input As #FNO '会社.csvパス名を開く Do Until EOF(FNO) Line Input #FNO, Buf A = Split(Buf, ",") ReDim Preserve B(66, i) '★ For j = LBound(A) To UBound(A) B(j, i) = A(j) '★ Next j i = i + 1 '2行目から開始 Loop Close #FNO B = WorksheetFunction.Transpose(B) ’★ .Range("A6").Resize(UBound(B), UBound(B, 2)) = B ' ★ ※ #1 ではなく FNO = FreeFile のようにアイル番号をつかいましょう。 |
![]() |
投稿日時: 20/12/02 15:40:22
投稿者: WinArrow
|
---|---|
COUNTIFの使い方に問題あり
|
![]() |
投稿日時: 20/12/02 16:54:50
投稿者: vaioyuki
|
---|---|
WinArrow さんの引用: ありがとうございます。 これ、実はデータ数固定ではないのですがどうやって変えたらいいかわからず、 色々検索してデータ件数をわざと多めにして設定しました。 やってみます!! また報告させて頂きます。 |
![]() |
投稿日時: 20/12/02 17:15:01
投稿者: WinArrow
|
---|---|
もう一つ
|
![]() |
投稿日時: 20/12/02 17:21:44
投稿者: WinArrow
|
---|---|
WorksheetFunction.Transpose
|
![]() |
投稿日時: 20/12/02 17:33:50
投稿者: Suzu
|
---|---|
問題は、
|
![]() |
投稿日時: 20/12/02 17:35:17
投稿者: vaioyuki
|
---|---|
色々ありがとうございます。
|
![]() |
投稿日時: 20/12/04 15:02:10
投稿者: vaioyuki
|
---|---|
別件で忙しく教えてもらったのにすぐに対応できずに申し訳ありません。
With wsKaisha '会社シート i = 0 ReDim B(66, i) FNO = FreeFile Open strFilePath2 For Input As #FNO '会社.csvパス名を開く Do Until EOF(FNO) Line Input #FNO, buf A = Split(buf, ",") ReDim Preserve B(66, i) For j = 0 To UBound(A) B(j, i) = A(j) Next j i = i + 1 '2行目から開始 Loop Close #FNO B = WorksheetFunction.Transpose(B) .Range("A6").Resize(UBound(B), UBound(B, 2)) = B ' .Range("A6").Resize(200000, 67) = B For j = 5 To 66 .Cells(5, j) = WorksheetFunction.CountA(.Range(.Cells(6, j), .Cells(i, j))) '列のカウント Next j End With 教えてもらってこのように記述したのですが、 15分経っても作業が終了しません。。。 別で同じような作業をしますのでやってみたらうまく取り入れてくれたのでコード的には問題ないかと思うのですが。。。 ちなみに、 うまくいったデータ件数は5685件、今回の会社シートは183361件あります。 最初と最後には Application.ScreenUpdating = False Application.Calculation = xlCalculationManual ・ ・ ・ ・ Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic は入れています。 以前はこんなに時間がかかることがなかったのですが何が原因なんでしょうか??? |
![]() |
投稿日時: 20/12/04 16:25:04
投稿者: vaioyuki
|
---|---|
追記です。
With wsSoshiki '組織シート i = 0 ReDim B(10, i) FNO = FreeFile Open strFilePath3 For Input As #FNO '組織.csvパス名を開く Do Until EOF(FNO) Line Input #FNO, buf A = Split(buf, ",") ReDim Preserve B(10, i) For j = LBound(A) To UBound(A) B(j, i) = A(j) Next j i = i + 1 '2行目から開始 Loop Close #FNO B = WorksheetFunction.Transpose(B) .Range("A5").Resize(UBound(B), UBound(B, 2)) = B ' .Range("A5").Resize(300000, 11) = B End With すると結果が、 10380 WFUSER xxx-jun xxx-hru xxx_XXXXXX xxx-tkh xxx-shu xxx-say xxx-aki xxx-nob xxx-jni 10380 WFUSER xxx-jun xxx-hru xxx_XXXXXX xxx-tkm xxx-shu fukui-say xxx-aki xxx-nob xxx-jni 10380 WFUSER xxx-jun xxx-hru xxx_XXXXXX xxx-tkm xxx-shu fukui-say xxx-aki xxx-nob xxx-jni 10380 WFUSER xxx-jun xxx-hru xxx_XXXXXX xxx-tkm xxx-shu fukui-say xxx-aki xxx-nob xxx-jni 最初のユーザコードだけがA列から記載され、 3500行あたりでB列に移動してまたユーザコードが記載されているようになっています。 他のシートと違うところは、列数が少ない(10列)、A5から貼付なのですがそれで問題になっているのでしょうか。。。(´;ω;`)ウゥゥ |
![]() |
投稿日時: 20/12/04 21:06:14
投稿者: WinArrow
|
---|---|
ブレークポイントを設定したり、ステップ実行で確認してみて下さい。
|
![]() |
投稿日時: 20/12/07 12:15:13
投稿者: Suzu
|
---|---|
読み込み全数に対し、配列を組みなおしたりしているので、遅くて当然です。
|
![]() |
投稿日時: 20/12/07 15:36:04
投稿者: vaioyuki
|
---|---|
たくさんのアドバイス、ありがとうございます。
With wsSoshiki '組織シート i = 0 ReDim B(10, i) FNO = FreeFile Open strFilePath3 For Input As #FNO '組織.csvパス名を開く Do Until EOF(FNO) Line Input #FNO, buf A = Split(buf, ",") ReDim Preserve B(10, i) For j = LBound(A) To UBound(A) B(j, i) = A(j) Next j i = i + 1 '2行目から開始 Loop Close #FNO Stop B = WorksheetFunction.Transpose(B) .Range("A5").Resize(UBound(B), UBound(B, 2)) = B ' .Range("A5").Resize(300000, 11) = B End With しかし、 B = WorksheetFunction.Transpose(B) ここを過ぎると B をローカルウィンドウで見てみると、 B(1) B(1.1) "10380" B(1.2) "WFUSER" B(1.3) "xxx-jun" ・ ・ ・ B(1.10) "xxx-nob" B(1.11) "xxx-jni" B(2) B(2.1) "10380" B(2.2) "WFUSER" B(2.3) "xxx-jun" ・ ・ ・ B(2.10) "xxx-nob" B(2.11) "xxx-jni" のような配列になってしまいました。 最後は B(3563.11) "XXX-syo" で終わっているのでここで3563行までしかいかずにどうも最初に教えていただいた、行と列を入れ替える作業がここにきてまた元に戻っている? 他のシートではうまくいけてるのになぜこのシートだけ? 何度も見返して同じコードを書いているとは思うのですが、 列数が違う、貼付する位置が違うだけなのですが何が原因なんでしょう。。。 |
![]() |
投稿日時: 20/12/07 15:50:38
投稿者: vaioyuki
|
---|---|
Suzuさん
|
![]() |
投稿日時: 20/12/08 13:21:02
投稿者: vaioyuki
|
---|---|
ありがとうございます。
With wsSoshiki '組織シート i = 0 ReDim B(10, i) FNO = FreeFile Open strFilePath3 For Input As #FNO '組織.csvパス名を開く Do Until EOF(FNO) Line Input #FNO, buf A = Split(buf, ",") ReDim Preserve B(10, i) For j = LBound(A) To UBound(A) B(j, i) = A(j) Next j i = i + 1 '2行目から開始 Loop Close #FNO Stop B = WorksheetFunction.Transpose(B) .Range("A5").Resize(UBound(B), UBound(B, 2)) = B ' .Range("A5").Resize(300000, 11) = B End With Close #FNO のあとにSTOPかけると、 それまでの B をプロシージャで確認すると、 B(0) B(0.0) "10380" B(0.1) "10380" ・ ・ ・ B(0.265705) "xxx-mas" B(0.265706) "xxx-mas" B(1) B(1.0) "000000" B(1.1) "000001" ・ ・ ・ B(1.265705) "000123" B(1.265706) "000123" のようにきちんと B に格納しているのですが、次のステップ(B = WorksheetFunction.Transpose(B))に移動したら B(0) がなくなり、 B(1) B(1.1) "10380" B(1.2) "WFUSER" B(1.3) "xxx-jun" ・ ・ ・ B(1.10) "xxx-nob" B(1.11) "xxx-jni" B(2) B(2.1) "10380" B(2.2) "WFUSER" B(2.3) "xxx-jun" ・ ・ ・ B(2.10) "xxx-nob" B(2.11) "xxx-jni" のように1列のデータだけしかなくなりました。 行と列が入れ替わる。。。という言い方は間違っているかもしれませんが、 データとしては1列目しか残らなくなり、なぜかこの場合だと3563行読み込んだ後に次の列に移動してまた元データの1列目を表示するような症状になっています。 |
![]() |
投稿日時: 20/12/08 15:31:34
投稿者: WinArrow
|
---|---|
VBAで使用する班列操作関数には、横配列の要素数に制限があるようです。
|
![]() |
投稿日時: 20/12/08 16:08:41
投稿者: vaioyuki
|
---|---|
いえいえ、そんなそんな!!
|
![]() |
投稿日時: 20/12/08 17:21:13
投稿者: Suzu
|
---|---|
引用: QueryTableオブジェクトの AdjustColumnWidth プロパティ https://docs.microsoft.com/ja-jp/office/vba/api/excel.querytable.adjustcolumnwidth 判りづらい日本訳になっていますが、Falseを渡せば 自動的に幅を調整する機能をOffにできます。 |
![]() |
投稿日時: 20/12/09 10:10:38
投稿者: vaioyuki
|
---|---|
Suzuさん
With wsKihon.QueryTables.Add(Connection:="text;" & strFilePath1, Destination:=wsKihon.Range("$A$6")) '基本シート .AdjustColumnWidth = False .TextFilePlatform = 932 .TextFileCommaDelimiter = True .TextFileColumnDataTypes = Array(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, _ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2) .Refresh BackgroundQuery:=False End With With wsKihon ' .Columns("A").ColumnWidth = 23.5 ' .Columns("B").ColumnWidth = 39.5 ' .Columns("C").ColumnWidth = 41.5 ' .Columns("D").ColumnWidth = 12.5 ' .Columns("E:AT").ColumnWidth = 7 ' .Columns("AU").ColumnWidth = 29.5 ' .Columns("AV:AY").ColumnWidth = 7 ' .Columns("AZ:BI").ColumnWidth = 12.5 ' .Columns("BJ:BN").ColumnWidth = 7 r = 0 r = .Range("A1").CurrentRegion.Rows.Count For j = 4 To 86 .Cells(5, j) = WorksheetFunction.CountA(.Range(.Cells(6, j), .Cells(r, j))) '列のカウント Next j End With コメントオフしてますが、ひとつずつ設定していましたw。( ;∀;) 助かりました!! こちらでやってみます。 長々とありがとうございました。 |