Board logo

標題: [發問] 如何將A,B欄轉換成沒有空格及要特定排列之C,D欄 [打印本頁]

作者: lcctno    時間: 2015-8-16 18:36     標題: 如何將A,B欄轉換成沒有空格及要特定排列之C,D欄

如圖及附件 如何將A,B欄轉換成沒有空格及要特定排列之C,D欄

1. 去除A,B欄內空白之格
2. C欄之值是由大至小 D欄之值是同步於C欄(跟著C欄移位)
3. A,B欄之值是個變數 會依據設定方式而改變 故C,D欄之總格數也會跟著變
4. A,B欄之總格數 若是變數 會造成不易寫程式 那我可以固定 但最好也允許A,B欄之總格數可以是變數
5. 在此先感謝大家踴躍的提供方法 幫小弟我完成不可能的任務 (我已花費數天的精神與時間 但還是無法完成)


[attach]21730[/attach]


[attach]21731[/attach]
作者: lcctno    時間: 2015-8-16 21:33

我弄了幾天還是卡在這�� 一直沒有進展 可否請高手賜教


[attach]21732[/attach]


[attach]21733[/attach]
作者: lpk187    時間: 2015-8-16 22:25

回復 2# lcctno

你的數據用一般排序就可以做到了啊!不懂為什麼要寫成程式?
  1. Option Base 1
  2. Public Sub Ex()
  3. Set d = CreateObject("scripting.dictionary")
  4. aa = Cells(Rows.Count, 1).End(xlUp).Row
  5. bb = Cells(Rows.Count, 2).End(xlUp).Row
  6. Dim ar1()
  7. If aa < 2 Or bb < 2 Then Exit Sub
  8. If aa > bb Then
  9.     arr = Range("A3:B" & aa)
  10. Else
  11.     arr = Range("A3:B" & bb)
  12. End If

  13. For i = 1 To UBound(arr) - 1
  14.     For j = i + 1 To UBound(arr)
  15.         If arr(i, 2) > arr(j, 2) Then
  16.             r1 = arr(i, 1)
  17.             r2 = arr(i, 2)
  18.             arr(i, 1) = arr(j, 1)
  19.             arr(i, 2) = arr(j, 2)
  20.             arr(j, 1) = r1
  21.             arr(j, 2) = r2
  22.             
  23.         End If
  24.     Next
  25. Next

  26. For i = 1 To UBound(arr)
  27.     If arr(i, 1) <> "" And arr(i, 2) <> "" Then
  28.         n = n + 1
  29.         ReDim Preserve ar1(1 To 2, n)
  30.         ar1(1, n) = arr(i, 1)
  31.         ar1(2, n) = arr(i, 2)
  32.     End If
  33. Next
  34. [e3].Resize(UBound(ar1, 2), 2) = Application.Transpose(ar1)
  35. End Sub
複製代碼

作者: lcctno    時間: 2015-8-16 22:40

回復 3# lpk187
我知道"用人工是很容易達成的" 但只要參數一改就得重新來過 且對非寫程式之人 跟本很難使用 甚至不會正確使用

非常感謝您的意見及公式 我先收下待測試 若有問題 我會再詢問您 謝謝您的幫助
作者: lpk187    時間: 2015-8-16 22:50

回復 4# lcctno


    我上面程式多了一行Set d = CreateObject("scripting.dictionary")請自行刪除!         
作者: lcctno    時間: 2015-8-16 23:25

本帖最後由 lcctno 於 2015-8-16 23:39 編輯

回復 5# lpk187
"我上面程式多了一行Set d = CreateObject("scripting.dictionary")請自行刪除!"

刪不刪結果是一樣  老實說我幾乎看不懂您提供之程式內容的含意 但我還知道將 "[e3].Resize(UBound(ar1, 2), 2) = Application.Transpose(ar1)" 改成[c3].Resize(UBound(ar1, 2), 2) = Application.Transpose(ar1) 才能對號入座

感謝您 可達到我要的內容了
但有一個問題 請問真的沒辦法不用VBA來執行嗎? 因為參數一改變 數值不會直接跟著變 還得必須要加上點一個按鈕 才能得到正確值 請問可有方法用一般函數來達成
最後除了謝謝您 還是要感謝您的熱心幫助
ps. 我目前在嘗試將我這幾年來做的統計分析所得的結果 轉換成資金配置的表格 只要簡單的輸入可投資的總金額 及配合累積發生率的參與時機 那表格就會自動告訴您買的配置方式
我已老了 這是為我的兒子寫的 怕他不會正確的使用 所以希望能讓沒基本知識的他也能容易使用
我不太會寫程式 因為學校完全沒學過Excell 但我知道怎麼於股市賺錢(是一定賺) 所以........
作者: lcctno    時間: 2015-8-17 08:54

回復 3# lpk187

我遇到問題了 原附件上的A,B,C,D欄 在我真實的位置是T,U,V,W 修改了數小時 卻無法修改成功  再次的麻煩您了
另外請多加上一指令 於整理後要貼上之前 請先清空該欄位之全部數值(原之C,D欄 現在的V,W欄) 謝謝您了



[attach]21736[/attach]



[attach]21737[/attach]
作者: lpk187    時間: 2015-8-17 12:00

回復 7# lcctno


         可以先請教你嗎?,因為你說"因為參數一改變 數值不會直接跟著變"
可以告訴我在哪裡會改變?什麼情況下改變?
VBA其實都可以做的出來的!沒有"因為參數一改變 數值不會直接跟著變"的
也不一定要按鈕的!
以下列檔案中的程式來說,只要你改變T欄中除了T1和T2外的任何儲存格U欄和V欄也會跟著改變的!
而且不用按鈕,只限欄改變哦!若你的S欄也會變更的話,也可以加入的!

[attach]21739[/attach]
作者: lcctno    時間: 2015-8-17 12:35

本帖最後由 lcctno 於 2015-8-17 12:36 編輯

回復 8# lpk187
如附件 只用選擇性貼上值及格式及註解
-請看Sheet2左上方 黃格內之值皆可能更改

  謝謝您  麻煩您了

有些小問題
1.Sheet1內 u3及v3 為何會空白
2. 股價2.99          投入金額999 ,477
並未被代入u及v內


        [attach]21740[/attach]
                 




   



[attach]21740[/attach]
作者: lpk187    時間: 2015-8-18 09:38

回復 9# lcctno


    [attach]21746[/attach]
作者: lcctno    時間: 2015-8-18 11:49

本帖最後由 lcctno 於 2015-8-18 11:50 編輯

回復 10# lpk187

我發現Sheet1之要使用之欄位有錯誤 故補上了一整排之空白欄位後也進去修改巨集 但要執行巨集時卻看不到巨集 故只好自己亂COPY 做了一個巨集 但執行起來沒看到有什麼動作
目前請您以巨集的方式下去寫 待正常後 我再請教您如何能當參數 一改變 結果也會馬上跟著變的方法 謝謝您了




附上我亂改過的檔案


[attach]21747[/attach]
作者: lpk187    時間: 2015-8-18 15:13

回復 11# lcctno


    [attach]21755[/attach]


[attach]21756[/attach]
作者: lcctno    時間: 2015-8-18 17:28

回復 12# lpk187

為何我在VB看的到Sheet1的巨集 但要執行巨集時卻看不到 如附圖
我看您還是幫我弄個可以用 工具/巨集/巨集 然後點選該巨集來"執行"

簡單的 我可能會 但稍微難的我真的不會 麻煩您先用簡單一點的方式 好方便我入門 對初學的我 我真的很想學會 但入不了門 真的非常的謝謝您的用心教導我




[attach]21759[/attach]

[attach]21758[/attach]
作者: lpk187    時間: 2015-8-18 21:15

回復 13# lcctno

Private Sub Worksheet_Change(ByVal Target As Range)
End Sub
是屬於"工作表事件"的程序是不會在巨集中出現,會在巨集中出現的只有Module1、Module2... 或者是程序以Public Sub  xxxx  中才會出現   
而以Private Sub xxx開頭的程序也不會出現在巨集簿中,這裡請參考VBA說明,"Sub 陳述式"
Worksheet_Change工作表事件若要在其他的工作表中使用必須要整個複製過去,它是屬於私有領域的程序,以事件來觸發,而不是利用按鈕,這裡請參考VBA考說明中的Worksheet.Change 事件的
作者: lcctno    時間: 2015-8-18 21:52

回復 14# lpk187

我是初學者 目前沒有能力將之轉換成我能使用之巨集
且我有嘗試將您附上的檔案T,U行之數值改變 但V,W行內之值並無法自行變更 那反而造成我不敢使用該數據
我看我還是用最基本的人工資料排序後複製貼上 或可使用錄製新巨集的方式來處理 免得我可能做白工 還可能壞了我原來可得到的正確統計 那將可能會輸的不明不白
您說呢? 那是錢的戰爭 請不要怪我挑剔
雖然我沒能幸運的得到完美的解答 但我知道您是用心的想幫我解決問題 真的我還是很感謝您的幫助
作者: lcctno    時間: 2015-8-18 22:20

回復 14# lpk187
我目前是在想辦法將我過去用傳統的基本語法(檔案真的很大 有一檔已770mbs 且還不是我真的喜歡的分析方式) 開啟費時 改變內容之data 儲存時間也很費時 所以才想嘗試使用巨集的方式來寫  但總不能為了減少檔案體積(mbs或許改天變成gbs) 而得到沒可信度的資料吧! 路雖遠 但慢慢走或許還是可能會平安的到達目的地吧! 真的還是很感謝您 若您改天想介入股市相關之產物 我可提供我的賺錢心法
這是其一"想法不改變 做法當然也不會變 那輸家怎麼會變成贏家"
作者: 准提部林    時間: 2015-8-22 18:27

若不用vba,且為動態數據,加個輔助欄即可:
c3公式:下拉至資料尾筆
=IF(OR(A3="",B3=""),"",A3*10^8+ROW())
 
d3公式:右拉e3再下刷
=IF(ROW(D1)>COUNT($c:$c),"",INDEX(A:A,RIGHT(LARGE($c:$c,ROW(D1)),5)))
 




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