Board logo

標題: [發問] 請問如何將偶數列的文字轉成數值(已有基本語法 但不會組合) [打印本頁]

作者: HCG10G8bear    時間: 2013-10-31 11:10     標題: 請問如何將偶數列的文字轉成數值(已有基本語法 但不會組合)

各位大大好

小弟近期開始使用VB程式

因為是以需求導向為主 現在多用錄製巨集在去修改

現在希望能將偶數列的文字(是數字)轉成數值(可以加總的類型)

目前是用土法煉鋼法選取偶數列  Range(" 2:2,4:4,6:6 ").select

爬文了解使用函數 =mod(row(),2)=0 可以一次選取偶數列

轉換數值的語法   Range("2:2,4:4,6:6').NumberFormatLocal = "G/通用格式"

到這邊小弟就卡關了 不知道是否有解決方法

謝謝
作者: Baracuda    時間: 2013-10-31 13:43

1.試著加一個 Column ,把偶數 Row 排序在一起。
2.把排在一起的 Row 內容化為值
作者: owen06    時間: 2013-10-31 14:26

回復 1# HCG10G8bear

你先用你的方式讓他選擇好內容後,再下面key:

Selection.NumberFormatLocal = "G/通用格式"
Selection = Selection.Value

這樣就行了。
作者: tpwhdavid    時間: 2013-10-31 16:40

Sub addp_2()
Dim i As Integer, j As Integer
j = Range("A1").End(xlToRight).Columns
For i = 2 To Range("A1").End(xlDown).Row Step 2
Cells(i, j + 1) = WorksheetFunction.Sum(Range(Cells(i, 1), Cells(i, j)))
Next
End Sub
這樣可以吧試看看
作者: HCG10G8bear    時間: 2013-11-1 11:47

先謝謝各位大大的回覆

Baracuda及owen06大大的方法好像是類似的

我會盡快試試看

tpwhdavid大感謝您不吝將程式碼直接寫出來給我

我會去試試看的

如果有問題會在詢問各位

謝謝大家
作者: HCG10G8bear    時間: 2013-11-4 11:37

回復 4# tpwhdavid

tpwhdavid大大您好

我執行您提供的語法

出現"溢位"的問題提示框

不知道出了什麼問題

我想我還是把檔案上傳請大大看一下好了
作者: HCG10G8bear    時間: 2013-11-4 12:01

各位大大好

我將檔案上傳了

先解釋一下碰到的問題

D2:J2,D4:J4..............D52:J52

這些儲存格的數字皆無法計算(已使用儲存格格式→數字→數值,依然沒用)

必須使用NumberFormatLocal = "G/通用格式" 的語法才能轉成可計算的數值

先前已有先用mod(row(),2)=0 的語法選取偶數列去做文字轉述值的變換

但碰到D2:J2.....D52:J52的儲存格沒有數字時,會將A2,A4.....A52的值帶入空缺的儲存格

現在想改成直接選取D2:J2,D4:J4,........D52:J52

並作文字轉述值的動作

想請問各位大大該如何執行

謝謝各位的幫忙

感激不盡
作者: owen06    時間: 2013-11-4 13:31

回復 7# HCG10G8bear

改這樣子就行了
Sub TEST()
For I = 2 To UsedRange.Rows.Count Step 2
Cells(I, 4).Resize(1, 7).NumberFormatLocal = "G/通用格式"
Cells(I, 4).Resize(1, 7) = Cells(I, 4).Resize(1, 7).Value
Next
End Sub
作者: HCG10G8bear    時間: 2013-11-5 08:57

本帖最後由 HCG10G8bear 於 2013-11-5 08:59 編輯
回復  HCG10G8bear

改這樣子就行了
Sub TEST()
For I = 2 To UsedRange.Rows.Count Step 2
Cells(I, ...
owen06 發表於 2013-11-4 13:31


owen06大大 謝謝您的回覆

按照您的程式確實可以執行

但您的程式我有點不懂 希望您釋疑

For Next 是執行迴圈的函數

Sub TEST()
For I = 2 To UsedRange.Rows.Count Step 2                     
Cells(I, 4).Resize(1, 7).NumberFormatLocal = "G/通用格式"   
Cells(I, 4).Resize(1, 7) = Cells(I, 4).Resize(1, 7).Value        
Next
End Sub

'從第二列開始的偶數列 延伸到有使用的儲存格到最後一列  count step 2 不懂是什麼
'Cells(I,4)是儲存格D2 Resize不知道為何 將(1,7)改為(1,20)即可將數值化D2往右延伸
'轉換文字的數字成數值化的數字

請問我這樣解釋哪裡有問題?不懂的地方還請大大指導

謝謝大大不吝教導

真的非常感謝您 省了我好多的時間
作者: owen06    時間: 2013-11-5 10:33

回復 9# HCG10G8bear


    UsedRange.Rows.Count=使用的範圍.列數.計算
   
    step 2 = 每一次跳二階
    for i = 1 to 10 , i 會是1到10的連續數
    for i = 1 to 10 step 2,i 會是 1、3、5、7、9
    for i = 1 to 10 step 3,i 會是 1、4、7、10
    這樣應該很明暸吧。
    因為你都是偶數列要執行動作,所以就從第2列開始,
    每一次跳2階,第2列~第4列~第6列,
    一直到UsedRange.Rows.Count所計算出來的那一列為止,
    就不會因為設的範圍太大而浪費執行的時間。

    RESIZE=以某個儲存格為基準點來選取範圍   
    [a1].resize(1,1).select     選擇範圍為a1為基準點的1列及1行,選取結果為a1
    [a1].resize(10,10).select  選擇範圍為a1為基準點的10列及10行,選取結果為a1:j10
作者: HCG10G8bear    時間: 2013-11-5 11:14

回復 8# owen06

owen06大大

我使用工具→巨集→VB編輯器     檢視→程式碼

貼上大大您提供的程式碼 在到Excel sheet執行巨集 可以執行成功

但是只要將巨集儲存

在執行TEST巨集 會出現   執行階段錯誤'424': 此處需要物件

請問是發生什麼問題了呢

謝謝
作者: owen06    時間: 2013-11-5 12:44

回復 11# HCG10G8bear


可是…我照你所說的方式儲存完再開也都沒問題吶,
你要不要上傳附件,看一下問題出在哪?
作者: HCG10G8bear    時間: 2013-11-6 12:50

回復 12# owen06


OWEN06大大

謝謝您的解釋 我學到很多喔

副檔我之前有上傳了

偶數列特定儲存格.zip

再麻煩你幫我CHECK一下

謝謝您不厭其煩的幫忙

謝謝
作者: owen06    時間: 2013-11-6 13:09

回復 13# HCG10G8bear


    我試都沒問題呀,你比對看看是不是有哪裡不同吧~
作者: ML089    時間: 2013-11-6 15:34

回復 14# owen06

我執行都很正常,應該沒有問題
作者: HCG10G8bear    時間: 2013-11-7 10:57

本帖最後由 HCG10G8bear 於 2013-11-7 10:59 編輯

回復 15# ML089

謝謝兩位大大幫我測試

我想我找到問題了

我只要將程式放到 專案→偶數列特定儲存格→sheet1 可以執行沒問題


但是只要把程式放到 PERSONAL→模組→Module1    就會發生執行階段錯誤


如果不能存到PERSONAL 就沒辦法後續的程式應用了

請問這是發生什麼問題了呢
作者: HCG10G8bear    時間: 2013-11-7 11:05

回復 16# HCG10G8bear

[attach]16614[/attach]這樣可以執行成功

[attach]16615[/attach]這樣就失敗了
作者: owen06    時間: 2013-11-7 12:57

回復 17# HCG10G8bear
  1. Sub TEST()
  2. For I = 2 To Sheet1.UsedRange.Rows.Count Step 2
  3. Sheet1.Cells(I, 4).Resize(1, 7).NumberFormatLocal = "G/通用格式"
  4. Sheet1.Cells(I, 4).Resize(1, 7) = Sheet1.Cells(I, 4).Resize(1, 7).Value
  5. Next
  6. End Sub
複製代碼
這樣改就行了,因為你放在模組裡,而不是直接放在sheet1裡,
所以必需明確的告訴他是在哪個sheet裡的哪些東西,
這樣他才會去那裡找,不然就會迷路。
作者: HCG10G8bear    時間: 2013-11-8 09:15

回復 18# owen06

owen06大大

這樣子執行就不會發生執行階段錯誤了

但是

它的值不會變成數字耶

就是執行後沒有任何變化

我看了好久 好像也沒有地方少sheet1

是還要改語法嗎?
作者: owen06    時間: 2013-11-8 09:36

回復 19# HCG10G8bear


你要不要把你自己使用,有問題的那個檔案放上來讓我們幫你檢查一下?
因為你說的問題我在執行上都沒發生,這樣要隔空把脈是有點困難的。
作者: Hsieh    時間: 2013-11-8 11:08

回復 19# HCG10G8bear
以你的資料特性用特殊儲存格可避免迴圈
  1. Sub ex()
  2. With Sheets("Sheet1")
  3. .Columns("B:B").SpecialCells(xlCellTypeConstants, 1).EntireRow.NumberFormat = "#"  '改變儲存格格式
  4.    With .UsedRange
  5.    .Value = .Value  '重新填入資料
  6.    End With
  7. End With
  8. End Sub
複製代碼

作者: HCG10G8bear    時間: 2013-11-8 13:36

本帖最後由 HCG10G8bear 於 2013-11-8 13:37 編輯

回復 20# owen06

[attach]16639[/attach]
owen06大

附檔都是公司所查詢的庫存

由公司系統轉成Excel時 各尺寸的數字為文字檔 無法加總

所以發帖詢問要如何將特定的偶數列儲存格轉換成數值

目前執行狀況是不會出現執行階段錯誤

但是執行後也沒有將各尺寸的數字(文字)轉成可計算的數值

[attach]16634[/attach]
[attach]16635[/attach]
[attach]16636[/attach]



不好意思 一直麻煩您

謝謝您

[attach]16637[/attach]
作者: HCG10G8bear    時間: 2013-11-8 13:44

回復 21# Hsieh


超級版主您好

您的程式碼有用 可以正常執行

不過我看不太懂這個地方

Columns("B:B").SpecialCells(xlCellTypeConstants, 1)

可否麻煩您釋疑解惑

謝謝您
作者: GBKEE    時間: 2013-11-8 13:46

本帖最後由 GBKEE 於 2013-11-8 13:59 編輯

回復 1# HCG10G8bear
這語法錯誤 Range("2:2,4:4,6:6').NumberFormatLocal = "G/通用格式"
  1. Range("2:2,4:4,6:6").NumberFormatLocal = "G/通用格式"
複製代碼
回復 17# HCG10G8bear
UsedRange是工作表的物件(工作表中已使用的範圍)
工作表模組中使用UsedRange就是指這工作表的UsedRange (但可如:Sheet1模組中輸寫, Sheet2.UsedRange)
在一般模組中(非工作表模組)沒有指明UsedRange的父層(工作表),電腦很笨不會看穿使用者的心思,就說找不到物件
回復 22# HCG10G8bear
PERSONAL模組中程式碼可修改如下
  1. For I = 2 To ActiveWorkbook.ActiveSheet.UsedRange.Rows.Count Step 2
複製代碼
回復 23# HCG10G8bear

SpecialCells方法 本討論區有多篇的討論,也可詳看VBA說明
作者: owen06    時間: 2013-11-8 14:44

回復 22# HCG10G8bear


在看了你之前附的圖之後,我想應該找出原因了,
你似乎是有另外用有一個叫personal的excel檔來儲存模組,
然後再開其他excel檔來執行personal裡模組的程式,
而我寫的時候單純的是以在同一個檔案底下的方式來寫的,
並沒有注意到這個狀況,所以才會造成這些問題。
作者: owen06    時間: 2013-11-8 14:46

回復 24# GBKEE


   順便藉這個問題請教一下版主,為什麼這個case,
   我直接寫sheet1,就不能在其他檔案底下執行,
   但如果改成都sheets("sheet1"),就可以通用了,
   請問這是什麼原因呢?煩請賜教,謝謝~
作者: GBKEE    時間: 2013-11-8 15:46

本帖最後由 GBKEE 於 2013-11-8 15:48 編輯

回復 26# owen06
直接寫sheet1,就不能在其他檔案底下執行,因sheet1指這檔案的工作表模組名稱,雖然其他檔案也有sheet1的工作表模組名稱,
這檔案的程式碼中無法引用其他檔案的物件,
須如此
  1. ActiveWorkbook.Sheets ("sheet1") '名稱
  2.     ActiveWorkbook.Sheets (1)        '索引值
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)