Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5285 / 13644 ツリー ←次へ | 前へ→

【51717】区切り位置 初心者 07/10/1(月) 19:46 質問[未読]
【51718】Re:区切り位置 neptune 07/10/1(月) 21:44 発言[未読]
【51721】Re:区切り位置 初心者 07/10/2(火) 6:57 発言[未読]
【51723】Re:区切り位置 neptune 07/10/2(火) 9:10 回答[未読]
【51725】Re:区切り位置 初心者 07/10/2(火) 9:39 発言[未読]
【51728】Re:区切り位置 Jaka 07/10/2(火) 13:55 発言[未読]
【51729】Re:区切り位置 Jaka 07/10/2(火) 14:12 発言[未読]
【51740】Re:区切り位置 初心者 07/10/3(水) 6:23 お礼[未読]

【51717】区切り位置
質問  初心者  - 07/10/1(月) 19:46 -

引用なし
パスワード
   エクセルの区切り位置を指定して実行をマクロ化しています
シート2のB3から値を取得してその値によって
シート1のA列の文字列を区切りたいのですが

Sub Macro1()
'
'
'変数初期化
i = 3
'ループ開始
Do
'データ取得
atai = Worksheets("sheet2").Range("B" & i).Value
'取得した値がスペースの場合、ループ終了
If atai = "" Then
  Exit Do
End If
If i <> 3 Then
  FULL_cmd = FULL_cmd & ","
End If
FULL_cmd = FULL_cmd & " Array(" & atai & ", 2)"
i = i + 1
Loop
FULL_cmd = "Array(" & FULL_cmd & ")"
MsgBox (FULL_cmd)
'ちょん切る
'
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
    Sheet1.Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
    FieldInfo:=FULL_cmd '1.
End Sub
1.の箇所でRangeクラスのTextToColumnsメソッドが失敗しましたが表示されます。
よろしくお願いいたします。

【51718】Re:区切り位置
発言  neptune  - 07/10/1(月) 21:44 -

引用なし
パスワード
   ▼初心者 さん:
こんにちは

次回からコンパイルが通る(ソース不具合が再現できるソース)をUPして下さい。
>Selection.TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
>    Sheet1.Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
>    FieldInfo:=FULL_cmd '1.
>End Sub
>1.の箇所でRangeクラスのTextToColumnsメソッドが失敗しましたが表示されます。
上記はコンパイルが通りません。
DataType、Destination等の名前付き引数が重複してます。

【51721】Re:区切り位置
発言  初心者  - 07/10/2(火) 6:57 -

引用なし
パスワード
   Sub Macro1()
'
'変数初期化
i = 3
'ループ開始
Do
'データ取得
atai = Worksheets("sheet2").Range("B" & i).Value
'取得した値がスペースの場合、ループ終了
If atai = "" Then
  Exit Do
End If
If i <> 3 Then
  FULL_cmd = FULL_cmd & ","
End If
FULL_cmd = FULL_cmd & " Array(" & atai & ", 2)"
i = i + 1
Loop
FULL_cmd = "Array(" & FULL_cmd & ")"
MsgBox (FULL_cmd)
'ちょん切る
Sheet1.Range("A:A").TextToColumns Destination:=Range("A1"), DataType:=xlFixedWidth, _
    FieldInfo:=FULL_cmd
    
'幅を調節
Columns("A:BR").EntireColumn.AutoFit
End Sub

失礼しました Selection.TextToColumns はSheet1.Range("A:A")に
書き換えてあります。

【51723】Re:区切り位置
回答  neptune  - 07/10/2(火) 9:10 -

引用なし
パスワード
   こんにちは

変数を明示的に宣言しておいてくださいね。分かり難いです。

それから、いきなり
>Columns("A:BR")・・・
などとやってますが、
これも、親シートを明示的に指定すべきです。現在Activeなシートでは
間違って誤動作の可能性もあります。

>FieldInfo:=FULL_cmd
ですが、FULL_cmdは文字列で、Array関数になっていません。

FieldInfoの要件である、
「省略可能です。バリアント型 (Variant) の値を使用します。区切り後の
列のデータ形式に関する情報を持つ配列を指定します。この引数の解釈は、
引数 DataType の値によって決まります。」
「引数 DataType が xlFixedWidth の場合 (ソース データの列幅が固定されて
いる場合) は、配列の 1 番目の要素は列の最初の文字の位置を、0 から始まる
整数で指定します。2 番目の要素は、上の 1 〜 9 の数値を使って、
列のデータ形式を指定します。」
に違反しています。

【51725】Re:区切り位置
発言  初心者  - 07/10/2(火) 9:39 -

引用なし
パスワード
   ▼neptune さん:

回答ありがとうございます

>こんにちは
>
>変数を明示的に宣言しておいてくださいね。分かり難いです。

よくわからなくて後で宣言しようかとしていました。すいません。。。

>
>それから、いきなり
>>Columns("A:BR")・・・
>などとやってますが、
>これも、親シートを明示的に指定すべきです。現在Activeなシートでは
>間違って誤動作の可能性もあります。

ごもっともです。

>
>>FieldInfo:=FULL_cmd
>ですが、FULL_cmdは文字列で、Array関数になっていません。
>
>FieldInfoの要件である、
>「省略可能です。バリアント型 (Variant) の値を使用します。区切り後の
>列のデータ形式に関する情報を持つ配列を指定します。この引数の解釈は、
>引数 DataType の値によって決まります。」
>「引数 DataType が xlFixedWidth の場合 (ソース データの列幅が固定されて
>いる場合) は、配列の 1 番目の要素は列の最初の文字の位置を、0 から始まる
>整数で指定します。2 番目の要素は、上の 1 〜 9 の数値を使って、
>列のデータ形式を指定します。」
>に違反しています。

変数宣言省略時はVariant系だというのを見たことがあるので
そのままにしていますが、いまいち理解できません。
Dim FULL_cmd As Variant をつけてもだめでした。

エクセルのシート2には
0 4 8 23 25 26 36 39 54 以下略 全70個(もちろんB列に)
まったく知らない初心者ですので、お手数ですがよろしくお願いいたします。

【51728】Re:区切り位置
発言  Jaka  - 07/10/2(火) 13:55 -

引用なし
パスワード
   文字列にしようとしているようなのでダメかもしれないけど。
区切り位置じゃなく、こんなのは?

Dim DT As Variant
DT = Split(Application.Trim(Cells(1, 1).Value), " ")
Cells(1, 2).Resize(, UBound(DT) + 1).Value = DT

【51729】Re:区切り位置
発言  Jaka  - 07/10/2(火) 14:12 -

引用なし
パスワード
   ReDim FULL_cmd(1 To フィールドの数)
For i = 1 To フィールドの数
  FULL_cmd(i) = Array(i, 2)
Next

【51740】Re:区切り位置
お礼  初心者  - 07/10/3(水) 6:23 -

引用なし
パスワード
   ▼Jaka さん:
>ReDim FULL_cmd(1 To フィールドの数)
>For i = 1 To フィールドの数
>  FULL_cmd(i) = Array(i, 2)
>Next


回答ありがとうございます。

解決しそうです。

また何かありましたらよろしくお願いいたします

5285 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free