Excel VBA質問箱 IV

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

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


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

【9562】文字列となっている数値を数値に戻す hana 03/12/8(月) 17:30 質問
【9565】Re:文字列となっている数値を数値に戻す INA 03/12/8(月) 18:18 回答
【9572】Re:文字列となっている数値を数値に戻す ichinose 03/12/8(月) 23:17 発言
【9573】Re:文字列となっている数値を数値に戻す(追... ichinose 03/12/8(月) 23:22 発言
【9575】Re:文字列となっている数値を数値に戻す(追... hana 03/12/9(火) 11:29 質問
【9584】Re:文字列となっている数値を数値に戻す(追... ichinose 03/12/9(火) 17:59 回答
【9585】Re:文字列となっている数値を数値に戻す(追... ichinose 03/12/9(火) 18:03 発言
【9597】Re:文字列となっている数値を数値に戻す(追... hana 03/12/10(水) 9:54 お礼
【9612】Re:文字列となっている数値を数値に戻す(追... ichinose 03/12/10(水) 13:14 発言
【9624】Re:追伸)の追加 hana 03/12/10(水) 17:29 お礼
【9625】Re:文字列となっている数値を数値に戻す(追... Jaka 03/12/10(水) 17:36 発言
【9626】Re:文字列となっている数値を数値に戻す(追... ichinose 03/12/10(水) 18:06 お礼
【9657】Re:文字列となっている数値を数値に戻す(追... hana 03/12/12(金) 10:07 お礼
【9724】すみません。 Jaka 03/12/15(月) 16:51 発言

【9562】文字列となっている数値を数値に戻す
質問  hana  - 03/12/8(月) 17:30 -

引用なし
パスワード
   たびたび申し訳ないのですが、
他エクセルファイルからのエクスポートや、
アクセスからのOutPutで、数値が文字列となってしまっています。
1つのセルを指定して、数値に戻すには下記の式で、できました。
Sheet全体で行うにはどのようにすればいいでしょうか?
教えていただけますか?
よろしくお願いします。

Sub tesut()
Dim g As Long
g = Range("G1")
Range("G1").FormulaR1C1 = g
End Sub

【9565】Re:文字列となっている数値を数値に戻す
回答  INA  - 03/12/8(月) 18:18 -

引用なし
パスワード
   左上をクリックして、全セルを選択して
書式設定を変更すればよいのでは?

【9572】Re:文字列となっている数値を数値に戻す
発言  ichinose  - 03/12/8(月) 23:17 -

引用なし
パスワード
   ▼hana さん:
こんばんは。

http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=9123;id=excel

からの流れですね?

ExcelブックをADOで接続してのI/Oは
色々と制限があるみたいです。
ADOXを使用してエクスポートブック(私の例でいうExportBK.xls)まで
作成するようなコードを書かないと数字を数字として登録する事は難しそうです
(少なくとも私が調べた限りでは)。

しかも、このエクスポートブックをADOで全て操作するようなコードを書かなければ
なりません(Excelで保存したりすると数値として保存されませんでした)。
但し、以下のような現象も確認しました。

仮にA列を数値、B列〜V列までは、文字列というエクスポートブック(ExportBK.xls)を考えてみます。

リンクで示したコードを用いて、アクティブシートの
セルA2が「1」、セルB2列〜V2列にそれぞれ「B」、「C」、・・・「V」が
入力されていて、これをExportBK.xlsにエクスポートしたとします。

ExportBK.xlsには、上記のデータが追加されると思いますが、
この時A列の「1」が問題になりますよね。
文字列の"1"として、登録されています。

これは、書式を触っただけでは、変更されませんでした。

このA列の"1"だけ、

>Sub tesut()
Dim a As Long
a = Range("AXX")
Range("AXX").FormulaR1C1 = a
>End Sub
等として、数字の1にしてブックExportBK.xlsを保存してみて下さい。

この状態で再度、エクスポートを行ってみて下さい。
今度は、A列が数字として登録されているはずです。

結果として、
直前の行の属性に追加される行が依存しているようなのですが・・・。

後は、既存データの数値化は、エクスポートブック(ExportBK.xls)に対して、
'=====================================================
Sub test()
  Set rng = Cells.SpecialCells(xlCellTypeConstants)
  rng.Value = rng.Value
End Sub

を実行してみて下さい。
数字として、再登録されると思います。


>アクセスからのOutPutで、数値が文字列となってしまっています。
↑については、数字が文字になってしまう現象が確認できませんでしたが、
修正は、上記のコードで可能だと思います。

【9573】Re:文字列となっている数値を数値に戻す(...
発言  ichinose  - 03/12/8(月) 23:22 -

引用なし
パスワード
   尚、「ADOでExcelを操作する」は、

http://support.microsoft.com/default.aspx?scid=KB;JA;257819

から探ってみました。

参考にして下さい。

【9575】Re:文字列となっている数値を数値に戻す(...
質問  hana  - 03/12/9(火) 11:29 -

引用なし
パスワード
   INAさん。ありがとうございます。
セルを指定して、書式設定で、数値を選んでも
数値に変換されないのです。
調べてみたところ、数値の右側に半角のスペースがあり、
それを削除すると、数値に戻ることが分かりました。

▼ichinose さん
ありがとうございます。

>http://www.vbalab.net/vbaqa/c-board.cgi?cmd=one;no=9123;id=excel
>からの流れですね?

その通りなのです。その節は大変お世話になりました。
今回教えて頂いた下の式で、解決したファイルと、
(アクセスからOutPutしたファイルは解決いたしました。
 ありがとうございます!)
文字化けをしてしまうファイルがあるのです。
エクスポート先のファイルの1行目には、項目名が入っているのですが、
これが #N/Aとなってしまったり、横の項目名が入ってしまったりします。
また、2行目からの数値も#N/Aとなったり、
1行目の項目名が、ランダムに入ってしまったりしています。

関数があるセルがいけないのかと、
エクスポート元のファイルで、一度、
コピー → 形式を指定して貼り付け → 値
としたものをエクスポートして、
下記のマクロを試してみたのですが
やはり、文字化け(?)を起こしてしまうのです。

何か方法は無いでしょうか?
申し訳ないのですが、よろしくお願いします。


数値は、A〜D、F〜Q、T、Uの列に入っています。


>後は、既存データの数値化は、エクスポートブック(ExportBK.xls)に対して、
>'=====================================================
>Sub test()
>  Set rng = Cells.SpecialCells(xlCellTypeConstants)
>  rng.Value = rng.Value
>End Sub

【9584】Re:文字列となっている数値を数値に戻す(...
回答  ichinose  - 03/12/9(火) 17:59 -

引用なし
パスワード
   ▼hana さん:
こんばんは。
すみません。私が間違えていました。
以下のコードで実行してみて下さい。
'===============================================
Sub test()
  Dim rng As Range
  Set rng = Range("a2").CurrentRegion
  rng.Value = rng.Value
End Sub

【9585】Re:文字列となっている数値を数値に戻す(...
発言  ichinose  - 03/12/9(火) 18:03 -

引用なし
パスワード
   ▼hana さん:
今更なんですが、一つ質問してよいですか?

これって、エクスポートファイルとしては、
mdbファイルの方が向いていませんか?
何故、Excelブックなんでしょうか?
特別な理由があるのでしょうか?
参考のために教えて下さい。

【9597】Re:文字列となっている数値を数値に戻す(...
お礼  hana  - 03/12/10(水) 9:54 -

引用なし
パスワード
   ichinoseさん。
ありがとうございました。
無事解決できました。

>これって、エクスポートファイルとしては、
>mdbファイルの方が向いていませんか?
>何故、Excelブックなんでしょうか?

mdbってアクセスのファイルですよね。

エクスポートの元となるファイルは、
オペレーターが、電話の対応状況を各々入力しています。
アクセスが人数分無い & 私の力不足のため、
一度エクセルのファイルにデータをまとめてから、
アクセスでインポートしています。

各個人のファイルから、直接mdbファイルへの
エクスポートを試みたのですが、
Access Opject Libraryを使用する方法しか
分からなかったので、この方法を取っています。
(Accessの入っていないパソコンでは、
参照設定にこの項目が無かったのです。)

【9612】Re:文字列となっている数値を数値に戻す(...
発言  ichinose  - 03/12/10(水) 13:14 -

引用なし
パスワード
   ▼hana さん:
こんにちは。
>各個人のファイルから、直接mdbファイルへの
>エクスポートを試みたのですが、
>Access Opject Libraryを使用する方法しか
>分からなかったので、この方法を取っています。
>(Accessの入っていないパソコンでは、
>参照設定にこの項目が無かったのです。)
なるほど、そういうことですか・・・。
逆に言えばAccessのないPCでも
「Microsoft ActiveX Data Objects 2.X Library」は、参照できていますね?
ならは、mdbファイルにアクティブシートの内容を直接書き込む事はできます。
しかも、Excelブックへの書き込みコードをちょっと変更するだけで・・・。

アクティブシートのデータは、
A列からV列で、
>数値は、A〜D、F〜Q、T、Uの列に入っています。
だとし、
mdbファイル(仮にExportmdb.mdbとしましょう)の書き込みテーブルの
テーブル名を「T_Test」としてみます。
テーブルT_Testの第1フィールドは、IDとし、オートナンバーにしました(これが主キー)。
第2〜第23フィールドは、アクティブシートのA列〜V列に対応する属性に設定しておきます。

テーブル構成の全体がわかりませんので、上記のような構成を例にあげると、

標準モジュール(Module1)に
'==========================================================
Sub main()
  Dim sql_str As String
  If open_ado(ThisWorkbook.Path & "\Exportmdb.mdb") = 0 Then
    sql_str = "select * from T_Test"
'変更したのは、↑とその上の行のファイル名だけ
   If open_rs(sql_str) = 0 Then
     With ActiveSheet
       Set rng = .Range(.Cells(2, 1), .Cells(.Rows.Count, 1).End(xlUp))
       End With
     If rng.Row > 1 Then
       For idx = 1 To rng.Count
        If add_rs(rng.Cells(idx).Resize(1, 22)) <> 0 Then
          Exit For
          End If
        Next idx
     Else
       MsgBox "アクティブシートにデータなし"
       End If
     rs_close
     End If
    close_ado
  Else
    MsgBox "接続失敗"
    End If
End Sub

標準モジュール(Module2)に
'===============================================================
Public cn As New ADODB.Connection
Public rs As New ADODB.Recordset
'===============================================================
Function open_ado(book_fullname As String) As Long
  On Error Resume Next
  link_opt = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
       "Data Source=" & book_fullname
'  ↑のよけいなストリングを省くだけ
  cn.Open link_opt
  open_ado = Err.Number
  On Error GoTo 0
End Function
'===============================================================
Sub close_ado()
  On Error Resume Next
  cn.Close
  On Error GoTo 0
End Sub
'===============================================================
Function open_rs(sql_str As String) As Long
  On Error Resume Next
  rs_close
  rs.Open sql_str, cn, adOpenStatic, adLockOptimistic
  If Err.Number <> 0 Then
    MsgBox Error$(Err.Number)
    End If
  open_rs = Err.Number
  On Error GoTo 0
End Function
'===============================================================
Function add_rs(rng As Range) As Long
  On Error GoTo err_add_rs
  With rs
   .AddNew
   For idx = 1 To rng.Count
     .Fields(idx).Value = rng.Cells(idx).Value
'    第1フィールドをオートナンバにしたので、第2フィールドからテーブルに
'    追加
    Next idx
   .Update
   End With
  add_rs = 0
ret_add_rs:
  On Error GoTo 0
  Exit Function
err_add_rs:
  MsgBox Error$(Err.Number)
  add_rs = Err.Number
  Resume ret_add_rs
End Function
'===============================================================
Sub rs_close()
  On Error Resume Next
  rs.Close
  On Error GoTo 0
End Sub

というよに簡単な変更で直接mdbファイルに追加できます。
現行で完成してしまったら、仕方ないですが、
試してみていけそうでしたら、こっちの方がよいのではないでしょうか?

【9624】Re:追伸)の追加
お礼  hana  - 03/12/10(水) 17:29 -

引用なし
パスワード
   ▼ichinose さん:
ありがとうございます!!!
各ユーザーからアクセスにエクスポートさせるのは
あきらめていたのです。

早速チャレンジします。

>逆に言えばAccessのないPCでも
>「Microsoft ActiveX Data Objects 2.X Library」は、参照できていますね?
>ならは、mdbファイルにアクティブシートの内容を直接書き込む事はできます。
>しかも、Excelブックへの書き込みコードをちょっと変更するだけで・・・。

【9625】Re:文字列となっている数値を数値に戻す(...
発言  Jaka  - 03/12/10(水) 17:36 -

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

内容を全く理解していません。
文字列になった数値を数字にするだけですが、

1列づつ選択して、
データ → 区切り位置 → そのまま完了 を繰り返すのではダメ?
(書式が標準になっているのが前提。)

【9626】Re:文字列となっている数値を数値に戻す(...
お礼  ichinose  - 03/12/10(水) 18:06 -

引用なし
パスワード
   ▼Jaka さん:
こんにちは。
>内容を全く理解していません。
>文字列になった数値を数字にするだけですが、
>
>1列づつ選択して、
>データ → 区切り位置 → そのまま完了 を繰り返すのではダメ?
>(書式が標準になっているのが前提。)
本当は、↑を投稿したかったけど、どうすればよかったか
思い出せませんでした。メモメモ・・。

【9657】Re:文字列となっている数値を数値に戻す(...
お礼  hana  - 03/12/12(金) 10:07 -

引用なし
パスワード
   Jaka さん.
ご指摘ありがとうございます。
セルの中をいじる事しか思いつきませんでした。
こんな、便利な方法があるのですね。
「区切り位置」って初めて使いました。
ありがとうございます!

【9724】すみません。
発言  Jaka  - 03/12/15(月) 16:51 -

引用なし
パスワード
   >1列づつ選択して、
>データ → 区切り位置 → そのまま完了 を繰り返すのではダメ?
>(書式が標準になっているのが前提。)

データ → 区切り位置 → そのまま完了 で、
文字数字から数字に変換されているので、表示形式が文字列のままでも計算に使えました。
見栄えをよくする為に、後から標準にしても大丈夫でした。
どうもすみませんでした。

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