Excel VBA質問箱 IV

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

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


2339 / 13646 ツリー ←次へ | 前へ→

【68560】時間をかけずにセルの文字列を値にする方法 ゆかわ 11/3/24(木) 18:20 質問[未読]
【68561】Re:時間をかけずにセルの文字列を値にする... kanabun 11/3/24(木) 19:14 発言[未読]
【68562】Re:時間をかけずにセルの文字列を値にする... kanabun 11/3/24(木) 19:19 発言[未読]
【68563】Re:時間をかけずにセルの文字列を値にする... とおりすがり 11/3/24(木) 22:56 回答[未読]
【68565】Re:時間をかけずにセルの文字列を値にする... kanabun 11/3/25(金) 10:29 発言[未読]
【68564】Re:時間をかけずにセルの文字列を値にする... UO3 11/3/25(金) 9:46 発言[未読]
【68611】Re:時間をかけずにセルの文字列を値にする... ゆかわ 11/3/29(火) 10:54 お礼[未読]
【68638】Re:時間をかけずにセルの文字列を値にする... kanabun 11/3/31(木) 17:01 発言[未読]

【68560】時間をかけずにセルの文字列を値にする方...
質問  ゆかわ  - 11/3/24(木) 18:20 -

引用なし
パスワード
   すみません、。以下のように特定の列を文字列から行に変更したいのですが
行数が多すぎて動作が鈍いです。
よりいい方法はないでしょうか。。お知恵を頂けたらと思います。

For i = lnMx To 2 Step -1
 Range("J" & i).Value = Val(Range("J" & i))'''''''''数値→文字列
 Range("J" & i).NumberFormatLocal = "#,##0" ''''表記形式変更
 If Range("J" & i).Value = 0 Then'''''0の行削除
  Range(Cells(i, 10), Cells(2, 10)).EntireRow.Delete
  Exit For
 End If
Next

【68561】Re:時間をかけずにセルの文字列を値にす...
発言  kanabun  - 11/3/24(木) 19:14 -

引用なし
パスワード
   ▼ゆかわ さん:

ちょっとコードで分からないところが...

たとえば、lnMx が 10000 だったとします。
J列の 9999行目が空白セルだったとします。
すると、
i = 9999 のとき
> If Range("J" & i).Value = 0 Then'''''0の行削除
>  Range(Cells(i, 10), Cells(2, 10)).EntireRow.Delete
>  Exit For
> End If
により、
2行目から9999行目まですべての行を削除する、
ということをしているように見えるのですが、
この解釈であってますか?

【68562】Re:時間をかけずにセルの文字列を値にす...
発言  kanabun  - 11/3/24(木) 19:19 -

引用なし
パスワード
   行削除はおいておいて、
前段の J列 文字列データを数値データに変換する処理だけですが
配列内で処理すれば、格段に速くなると思います。

Sub Try1()
  Dim i As Long
  Dim R As Range
  Dim v As Variant
  
  Set R = Range("J2", Cells(Rows.Count, "J").End(xlUp))
  v = R.Value
  For i = 1 To UBound(v)
    v(i, 1) = Val(v(i, 1))
    If v(i, 1) = 0 Then v(i, 1) = Empty
  Next
  R.ClearContents
  R.NumberFormatLocal = "#,##0"
  R.Value = v
End Sub

【68563】Re:時間をかけずにセルの文字列を値にす...
回答  とおりすがり  - 11/3/24(木) 22:56 -

引用なし
パスワード
   削除はともかく、数値化は区切り位置ではだめか?
あるいはPasteSpecialで乗算で1を指定。

【68564】Re:時間をかけずにセルの文字列を値にす...
発言  UO3  - 11/3/25(金) 9:46 -

引用なし
パスワード
   ▼ゆかわ さん:

おはようございます。

仮にJ列の【文字列】というのが 【数字だけの文字列】(つまり 123xyz 等がない)
のであれば、とおりすがりさんの方式のPasteSpecalが一括で処理できますので
お勧めします。

行の削除については、kanabunさんからも質問出ているように、要件がクリアでは
ないのですが、(書かれているコードを無視して)J列の値が 0 の行は削除する
ということであれば、これも、フィルターオプション等を使った一括処理が
いいかもしれません。

【68565】Re:時間をかけずにセルの文字列を値にす...
発言  kanabun  - 11/3/25(金) 10:29 -

引用なし
パスワード
   「形式を選択して貼り付け」の演算や「区切り位置」

(一般機能ではもちろんできますが、)
操作を記録してマクロ化しても、バージョンにより
機能しないことがありました

ht tp://www.moug.net/faq/viewtopic.php?t=57009&highlight=PasteSpecial

【68611】Re:時間をかけずにセルの文字列を値にす...
お礼  ゆかわ  - 11/3/29(火) 10:54 -

引用なし
パスワード
   お礼が遅くなりすみません!
数値への変換もPasteSpecalに変更し
フィルタにして、見出し以外のデータの範囲の可視データのみ削除という
ようにしたら成功しました!
すごく速くなって満足です。
ありがとうございました!!


▼UO3 さん:
>▼ゆかわ さん:
>
>おはようございます。
>
>仮にJ列の【文字列】というのが 【数字だけの文字列】(つまり 123xyz 等がない)
>のであれば、とおりすがりさんの方式のPasteSpecalが一括で処理できますので
>お勧めします。
>
>行の削除については、kanabunさんからも質問出ているように、要件がクリアでは
>ないのですが、(書かれているコードを無視して)J列の値が 0 の行は削除する
>ということであれば、これも、フィルターオプション等を使った一括処理が
>いいかもしれません。

【68638】Re:時間をかけずにセルの文字列を値にす...
発言  kanabun  - 11/3/31(木) 17:01 -

引用なし
パスワード
   ▼ゆかわ さん:

>フィルタにして、見出し以外のデータの範囲の可視データのみ削除という
>ようにしたら成功しました!
>すごく速くなって満足です。

解決されたようでなによりです。

削除行をソートして下方に集め、一括削除する例です。
参考までに

'▼Sort法により J列が0の行を削除
Sub Try2()
  Dim R As Range
  Dim mx As Long, i As Long
  Dim v As Variant, t As Variant
  
  Set R = Range("A1").CurrentRegion
  mx = R.Columns.Count
  v = R.Columns("J").Value
  ReDim t(1 To UBound(v), 1 To 1)
  
  'If Len(v(1, 1)) = 0 Then v(1, 1) = "Dmmy"
  t(1, 1) = "wk"
  For i = 2 To UBound(v)
    v(i, 1) = Val(v(i, 1))
    If v(i, 1) <> 0 Then t(i, 1) = 1
  Next
  With R.Columns("J")
    .ClearContents
    .NumberFormat = "#,##0"
    .Value = v
  End With
  '--------- 作業列で Sortして0の行を下方に集め,まとめて行削除
  With R.Columns(mx + 1)
    .Value = t
    R.Resize(, mx + 1).Sort _
      Key1:=R.Columns(mx + 1), Header:=xlYes
    .SpecialCells(xlBlanks).EntireRow.Clear
    .Clear
  End With
End Sub

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